4

首先,我不想创建单例类的子类。(至少我确定我没有尝试)。

我有一个ClassA抽象的类。

我有两个类ClassA1ClassA2扩展ClassA.

我想成为单身人士的班级ClassA1ClassA2我可以在每个代码中编写代码,但我更愿意编写一次代码ClassA并在所有子类中重用它。有没有办法做到这一点?

4

3 回答 3

6

ClassA可能不是——单例模式需要静态方法/字段,如果在一个地方定义,它们将由其所有子类共享。

于 2012-05-14T16:59:56.440 回答
1

我建议ClassA1A2 使用私有构造函数,并使用静态方法来创建对象。这样您就可以完全控制对象的创建。EffectiveJava 一书详细介绍了这种方法的优点。

于 2012-05-14T17:00:43.323 回答
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 非常好和简单。

于 2012-05-14T17:45:39.210 回答