限制类的DIRECT实例数

时间:2011-11-10 16:29:08

标签: java inheritance constructor instantiation

换句话说:一个类如何跟踪是否由于实例化其子类或其实例而调用其构造函数?

[请使用下面的示例代码]:

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

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

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

我希望限制通过调用Parent创建的new Parent(...)类的直接实例的数量,以及从计数中排除的数量,即由于实例化任何子项而创建的Parent个实例的数量课程Child1Child2

3 个答案:

答案 0 :(得分:4)

你可以做到

static final AtomicInteger count = new AtomicInteger();

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

你能解释一下你为什么要这样做吗?达到限制时你想要发生什么?

答案 1 :(得分:2)

如果您愿意遵循它,单一责任原则会建议您将实例限制的逻辑分离出来,或许可以分成工厂类。这样做的好处是不会从构造函数中抛出异常。

答案 2 :(得分:0)

我会这样做:

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
    }

}