В классе A: есть статический набор классов.Каждый раз, когда вызывается конструктор A, используйте this.getClass () для получения фактического класса, для которого требуется создать экземпляр (имейте в виду, что любой подкласс должен сначала вызывать супер-конструктор).
Есликласс хранится в наборе, брось это исключение.Если нет, то сохраните класс.
public class A {
private static final Set<Class<? extends A>> INSTANCE_HOLDER = new HashSet<>();
public A() {
if (INSTANCE_HOLDER.contains(this.getClass()))
throw new RuntimeException("can't create more than one instance.");
INSTANCE_HOLDER.add(this.getClass());
}
}
Этого должно быть достаточно для начала.
Для справки: хотя это должно сработать, это кажется довольно странной идеей.Если вам нужны одноэлементные объекты, рассмотрите, например, использование перечислений.Это предотвратит все тонкие проблемы, например, из-за создания потоков несколькими объектами.
Или, как указано в комментарии: как насчет времени жизни этих объектов?Вы можете использовать карту, чтобы сохранить ссылки на ваши синглтоны.
Но, в конце концов, все это звучит как нарушение принципа единой ответственности.