我想强制在父类的任何扩展类上实现单例模式。也就是说,我只想要每个子类的一个实例(可以通过Child.INSTANCE或类似的东西访问)。
理想情况下,我希望制作Child.INSTANCE对象,然后不要生成其他类型为Parent的对象。
目前我通过以下方式获取实例:
public class Child extends Parent {
public static final Child INSTANCE = new Child();
....
我想知道,java类可以以某种方式变成静态的吗?
谢谢=]
答案 0 :(得分:9)
您的子课程集是否已修复?如果是,请考虑使用enum
。
public enum Parent {
CHILD1 {
// class definition goes here
},
CHILD2 {
// class definition goes here
};
// common definitions go here
}
由于OP提到了状态模式,以下是基于enum
的状态机的两个示例:a simple one和a 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我回答过一段非常相似的问题。我相信这会做你想做的事情,但会有答案中提到的所有限制。