我怎么知道java中任何给定时间创建了多少个类实例?

时间:2013-09-18 16:37:31

标签: java oop

我怎么知道java中任何给定时间创建了多少个类实例? 我有A类,我想知道在任何给定时间创建了多少个实例? 请让我知道解决方案

4 个答案:

答案 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类而不是intsynchronized块,正如@rolfl在下面所述。如果他发布一个,那么所有对这个想法的赞成都应该回答他的答案。

答案 1 :(得分:0)

这实际上不是一个糟糕的问题,你可以通过使用sychronize和一个计数器来控制实例的数量,这个设计模式叫做实例控制类,它是“有效Java”中提到的第一个东西之一。约书亚布洛赫(第2章)

答案 2 :(得分:0)

没有直接的方法,但如果您真的对跟踪这些信息感兴趣,可以创建一个private static int instanceCounter字段并在构造函数中增加它。您还需要一个finalize方法,只要实例被垃圾回收,该方法就会递减计数器。

答案 3 :(得分:0)

你可以在它进入时实现一个计数器