Синглтон для каждого класса - PullRequest
0 голосов
/ 14 октября 2019

Как я могу определить три класса A, B, C, чтобы каждый из них мог быть создан только один раз. Другими словами, если один A уже был создан, больше не может быть создано. Но с созданием B должно быть все в порядке (если сначала не было создано ни одного B).

class A{
}

class B extends A{
}

class C extends B{
}

Produce:

A a1 = new A(); //Should work fine

A a2 = new A(); // Should throw an error if one instance is already created

B b1 = new B(); // Should work fine despite A instance is there or not

B b2 = new B(); // Should throw an error

C c1 = new C(); // Should work fine despite B instance is there or not

C c2 = new C(); // Should throw an error

1 Ответ

1 голос
/ 14 октября 2019

Вероятно, это плохая идея сделать что-то подобное, так как очень «волшебно» отрицать создание объекта только потому, что другой объект уже создан, но это возможно:

public class A {
  private static final Set<Class<?>> INSTANTIATED_CLASSES = new HashSet<Class<?>>();

  public A() {
    if (!INSTANTIATED_CLASSES.add(this.getClass())) {
      throw new IllegalStateException("Oh no! " + this.getClass() + " was already instantiated once!");
    }
  }
}

Этобудет гарантировать, что вы когда-либо сможете построить только на экземпляре A или на любом из его подклассов.

Обратите внимание, что основным недостатком глобального состояния, подобным этому, является то, что он станет чрезвычайно отличным для тестирования вашегокод, если вы не можете просто создавать объекты по своему желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...