我最近遇到过这个问题而未能找到解决方法。我希望我能在这里得到令人信服的答案。
问题:设A是一个非抽象类,由两个类B和C扩展(单独)。现在任务是只允许创建这些类的一个实例。如果客户端代码尝试创建任何这些类的第二个实例,则应抛出异常。
A obj11 = new A(); // Fine.
A obj12 = new A(); // thrown an exception.
B obj21 = new B(); // OR
A obj21 = new B(); // both these should be fine
但是不应该允许创建B类的第二个实例。
提前致谢。
P.S。 :这与单身人士不同。
答案 0 :(得分:1)
以下应该这样做。在现实世界中,应该有一些synchronized
个关键字。为简单起见,所有内容都塞进了一个文件中。
public class A {
static HashSet<Class> thereCanBeOnlyOne = new HashSet();
public A() {
Class c = this.getClass();
if (thereCanBeOnlyOne.contains(c))
throw new RuntimeException();
thereCanBeOnlyOne.add(c);
}
static public class B extends A {}
static public class C extends A {}
public static void main(String[] args) {
A a1 = new A();
B b1 = new B(); // OK
C c1 = new C(); // OK
C c2 = new C(); // throws exception
}
}
答案 1 :(得分:0)
这对你好吗?
public class A {
private static created = false;
public static A create() {
if (created) {
throws new RuntimeException();
} else {
created = true;
return new A();
}
}
protected A() {
}
}
public class B extends A {
private static created = false;
public static B create() {
if (created) {
throws new RuntimeException();
} else {
created = true;
return new B();
}
}
protected B() {
}
}
public class C extends A {
private static created = false;
public static C create() {
if (created) {
throws new RuntimeException();
} else {
created = true;
return new C();
}
}
protected C() {
}
}
您可以使用以下方式创建A,B和C:
A a = A.create();
B b = B.create();
C c = C.create();