Ограничить количество ПРЯМЫХ экземпляров класса - PullRequest
2 голосов
/ 10 ноября 2011

Другими словами: как класс может отслеживать, вызван ли его конструктор из-за создания экземпляра его дочернего класса или его экземпляр создан напрямую?

[Пожалуйста, укажите следующий пример кода]:

class Parent
{
    .............
    .........
    ..............
}

class Child1 extends Parent
{
    .............
    .........
    ..............
}

class Child2 extends Parent
{
    .............
    .........
    ..............
}

Я хочу ограничить количество прямых экземпляров класса Parent, созданных путем вызова new Parent(...) и, ИСКЛЮЧАЯ из подсчета, количество Parent экземпляров, созданных из-за создания любого из дочерних классов Child1 или Child2.

Ответы [ 3 ]

4 голосов
/ 10 ноября 2011

Вы можете сделать

static final AtomicInteger count = new AtomicInteger();

// in your Parent constructor.
if (getClass() == Parent.class && count.incrementAndGet() >= LIMIT)
   throw new IllegalStateException();

Можете ли вы объяснить, почему вы хотите это сделать? Что вы хотите, чтобы произошло при достижении лимита?

2 голосов
/ 10 ноября 2011

Если вы хотите следовать этому, принцип единой ответственности предложил бы вам отделить эту логику ограничения экземпляров, возможно, от фабричного класса. Это даст преимущество, если вы не будете генерировать исключения из конструктора.

0 голосов
/ 10 ноября 2011

Я бы сделал это:

public class Parent  {

    public Parent() {
        if (count.incrementAndGet() >= LIMIT) { //count is an AtomicInt/Long
            throw new InstantiationException("Too many instances");
        }

    protected Parent(boolean placeholder) { //protected means only subclasses can call it
        //do nothing with the placeholder, but it differentiates the two constructors
    }

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