Java:继承并成为单身人士

时间:2012-05-14 16:57:11

标签: java inheritance singleton

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

我有一个抽象的课程ClassA

我有两个类ClassA1ClassA2,可以扩展ClassA

我希望ClassA1ClassA2成为单身类。我可以在每个代码中编写代码来执行此操作,但我更愿意在ClassA中编写一次代码并在其所有子类中重用它。有没有办法做到这一点?

3 个答案:

答案 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非常简单。