换句话说:一个类如何跟踪是否由于实例化其子类或其实例而调用其构造函数?
[请使用下面的示例代码]:
class Parent
{
.............
.........
..............
}
class Child1 extends Parent
{
.............
.........
..............
}
class Child2 extends Parent
{
.............
.........
..............
}
我希望限制通过调用Parent
创建的new Parent(...)
类的直接实例的数量,以及从计数中排除的数量,即由于实例化任何子项而创建的Parent
个实例的数量课程Child1
或Child2
。
答案 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
}
}