Вероятно, это плохая идея сделать что-то подобное, так как очень «волшебно» отрицать создание объекта только потому, что другой объект уже создан, но это возможно:
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
или на любом из его подклассов.
Обратите внимание, что основным недостатком глобального состояния, подобным этому, является то, что он станет чрезвычайно отличным для тестирования вашегокод, если вы не можете просто создавать объекты по своему желанию.