首先,我不想创建单例类的子类。(至少我确定我没有尝试)。
我有一个ClassA
抽象的类。
我有两个类ClassA1
,ClassA2
扩展ClassA
.
我想成为单身人士的班级ClassA1
。ClassA2
我可以在每个代码中编写代码,但我更愿意编写一次代码ClassA
并在所有子类中重用它。有没有办法做到这一点?
首先,我不想创建单例类的子类。(至少我确定我没有尝试)。
我有一个ClassA
抽象的类。
我有两个类ClassA1
,ClassA2
扩展ClassA
.
我想成为单身人士的班级ClassA1
。ClassA2
我可以在每个代码中编写代码,但我更愿意编写一次代码ClassA
并在所有子类中重用它。有没有办法做到这一点?
ClassA
可能不是——单例模式需要静态方法/字段,如果在一个地方定义,它们将由其所有子类共享。
我建议ClassA1
A2 使用私有构造函数,并使用静态方法来创建对象。这样您就可以完全控制对象的创建。EffectiveJava 一书详细介绍了这种方法的优点。
这样做的唯一地方是在扩展 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 非常好和简单。