これが行われる唯一の場所は、Enum を拡張する enum クラスです。言語のひねりなどを使用しますclass ClassA<T extends ClassA>
。次のいずれかを行います。
public class ClassA {
private static final Map<Class<? extends ClassA>, ClassA> singletons = new HashMap<>();
public static <T extends ClassA> T get(Class<T> klazz) {
T singleton = klazz.cast(singletons.get(klazz));
if (singleton == null) {
try {
singleton = klazz.getConstructor().newInstance();
} catch (InstantiationException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException
| NoSuchMethodException | SecurityException e) {
throw new IllegalArgumentException(e);
}
singletons.put(klazz, singleton);
}
return singleton;
}
protected ClassA() { }
}
または、複数のシングルトンの必要性を再考し、一般的なコンテナー ルックアップ (おそらく宣言型 XML または注釈を使用) または Bean コンテナーを実行します。EJB 3.1 は非常に素晴らしくシンプルです。