创建第二个实例时抛出异常

时间:2014-06-09 17:49:58

标签: java inheritance hierarchy

我最近遇到过这个问题而未能找到解决方法。我希望我能在这里得到令人信服的答案。

问题:设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。 :这与单身人士不同。

2 个答案:

答案 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();