我怎么知道java中任何给定时间创建了多少个类实例? 我有A类,我想知道在任何给定时间创建了多少个实例? 请让我知道解决方案
答案 0 :(得分:7)
使用static variable在构造函数中跟踪它。
public class A {
private static int instances = 0;
public A() {
instances++;
}
}
如果您担心concurrency:
public class A {
private static final Object LOCK = new Object();
private static int instances = 0;
public A() {
synchronized(LOCK) {
instances++;
}
}
}
要解决您在下面的评论中所说的问题:如果您想知道有多少目前存在(即,还没有garbage collected),您可以尝试类似以下内容:
public class A {
private static final Object LOCK = new Object();
private static int instances = 0;
public A() {
synchronized(LOCK) {
instances++;
}
}
protected void finalize() throws Throwable {
synchronized(LOCK) {
instances--;
}
}
}
在对象被垃圾回收之前,将调用finalize()
方法。但垃圾收集是notoriously unreliable。
另外,作为附注,您可以使用AtomicInteger
类而不是int
和synchronized
块,正如@rolfl在下面所述。如果他发布一个,那么所有对这个想法的赞成都应该回答他的答案。
答案 1 :(得分:0)
这实际上不是一个糟糕的问题,你可以通过使用sychronize和一个计数器来控制实例的数量,这个设计模式叫做实例控制类,它是“有效Java”中提到的第一个东西之一。约书亚布洛赫(第2章)
答案 2 :(得分:0)
没有直接的方法,但如果您真的对跟踪这些信息感兴趣,可以创建一个private static int instanceCounter
字段并在构造函数中增加它。您还需要一个finalize
方法,只要实例被垃圾回收,该方法就会递减计数器。
答案 3 :(得分:0)
你可以在它进入时实现一个计数器