首先,我 NOT 尝试创建单例类的子类。 (至少我确定我不是想尝试)。
我有一个抽象的课程ClassA
。
我有两个类ClassA1
和ClassA2
,可以扩展ClassA
。
我希望ClassA1
和ClassA2
成为单身类。我可以在每个代码中编写代码来执行此操作,但我更愿意在ClassA
中编写一次代码并在其所有子类中重用它。有没有办法做到这一点?
答案 0 :(得分:6)
可能不是 - 单例模式需要静态方法/字段,如果在一个地方定义,它们将由ClassA
及其所有子类共享。
答案 1 :(得分:1)
我建议使用ClassA1
和A2的私有构造函数,并使用静态方法创建对象。这样您就可以完全控制对象创建。
EffectiveJava这本书详细介绍了这种方法的广告。
答案 2 :(得分:1)
唯一这样做的地方是扩展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非常简单。