Синглтон через enum против дизайна для теста
enum Singleton {
INSTANCE;
private static final TimeUnit TIME_UNIT = TimeUnit.HOURS;
void doStuff()
}
В модульном тесте TIME_UNIT
должно быть например TIMEUnit.MILLISECONDS
, В синглтоне без enum я бы переместил TIME_UNIT
конструктору, и пусть он будет передан ко времени создания. Это типичный способ написания тестируемого кода. Я знаю многих людей, которым нравится шаблон enum Singleton, и на самом деле он надежен и выглядит достаточно чистым для меня, но как достичь тестируемости?
Этот, кажется, в порядке, но нет строгого принуждения к использованию INSTANCE
вместо INSTANCE_FOR_TEST
в производственном коде:
enum TestableSingleton {
INSTANCE(TimeUnit.HOURS),
INSTANCE_FOR_TEST(TimeUnit.MILLISECONDS);
private final TimeUnit TIME_UNIT;
TestableSingleton(TimeUnit unit) {
TIME_UNIT = unit;
}
void doStuff()
}