静态/最终的java类?

时间:2011-01-03 16:23:47

标签: java singleton instance-variables

我想强制在父类的任何扩展类上实现单例模式。也就是说,我只想要每个子类的一个实例(可以通过Child.INSTANCE或类似的东西访问)。

理想情况下,我希望制作Child.INSTANCE对象,然后不要生成其他类型为Parent的对象。

目前我通过以下方式获取实例:

public class Child extends Parent {
    public static final Child INSTANCE = new Child();
    ....

我想知道,java类可以以某种方式变成静态的吗?

谢谢=]

5 个答案:

答案 0 :(得分:9)

您的子课程集是否已修复?如果是,请考虑使用enum

public enum Parent {
    CHILD1 {
        // class definition goes here
    },

    CHILD2 {
        // class definition goes here
    };

    // common definitions go here
}

由于OP提到了状态模式,以下是基于enum的状态机的两个示例:a simple onea complex one

答案 1 :(得分:1)

可以做到,但我不明白这一点。你最好使用枚举恕我直言。

enum {
  Singleton, 
  Child { /* override methods here * }
}

然而,要回答你的问题,你可以做以下

class SingletonParent {
   private static final Set<Class> classes = new CopyOnArraySet();
   { if (!classes.add(getClass()) throw new AssertionError("One "+getClass()+" already created."); }
}

答案 2 :(得分:1)

您正在寻找错误的设计模式。

看一下Factory模式。工厂可以创建一个类的单个实例,然后将其交给任何想要它的人。工厂可以分发父母,任何孩子或其他任何你想要的单身人士。

答案 3 :(得分:0)

您可以使用Java enum。基本上它会产生一堆公共静态类(就像你一样),但对它们有一些限制。

public enum Child {
   INSTANCE;
}

请注意,enums是完整的类,因此如果您愿意,可以根据每个实例轻松添加方法。

答案 4 :(得分:0)

我会回答question我回答过一段非常相似的问题。我相信这会做你想做的事情,但会有答案中提到的所有限制。