Я не знаком с использованием enuns для Singletons. Подход, который я предпочитаю, заключается в использовании статических инициализаторов следующим образом:
public class MySingleton {
private final Hashtable<SomeEnumType, UserSettings> settings;
// As this is static, the VM makes sure that this is called only once
private static final MySingleton INSTANCE = new MySingleton();
// We know the contstructor is called only once. Making it private
// guarentees no other classes can call it.
// ==> Thus this is a nice safe place to initialize your Hash
private MySingleton {
settings = new Hashtable<SomeEnumType, UserSettings>();
}
public static MySingleton getInstance() {
return INSTANCE;
}
public final UserSettings getSettings(SomeEnumType enumType) {
return settings.get(enumType);
}
}
И абоненты получают доступ к вашей карте следующим образом:
MySingleton.getInstance().getSettings(someEnum);
Предположительно, ваш синглтон делает что-то кроме управления хешем. В противном случае гораздо более простой подход состоит в том, чтобы просто сделать сам хэш статичным.
Другой распространенный подход к синглетонам (который мне тоже не нравится) - создание экземпляра синглтона по требованию следующим образом:
public class MySingleton {
private MySingleton instance;
private MySingleton() {}
public static synchronized MySingleton getInstance() {
if (instance == null) instance = new MySingleton ();
return instance;
}
}
Причина, по которой мне это не очень нравится, заключается в том, что для обеспечения безопасности потоков требуется синхронизация метода getInstance (). Вы получаете небольшой удар производительности для этого.