-1

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

4

4 回答 4

7

使用静态变量在构造函数中跟踪它。

public class A {

    private static int instances = 0;

    public A() {
        instances++;
    }
}

如果您担心并发性:

public class A {

    private static final Object LOCK = new Object();
    private static int instances = 0;

    public A() {
        synchronized(LOCK) {
            instances++;
        }
    }
}

要解决您在问题下方评论中所说的话:如果您想知道当前存在多少(即尚未被垃圾收集),您可以尝试以下操作:

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()方法将在对象被垃圾回收之前被调用。然而,垃圾收集是出了名的不可靠

此外,作为旁注,您可以使用AtomicInteger类而不是 anintsynchronized块,如下面的@rolfl 所述。如果他发布一个,所有对这个想法的支持都应该去他的答案。

于 2013-09-18T16:41:05.740 回答
0

你可以在它初始化时实现一个计数器

于 2013-09-18T16:42:22.623 回答
0

这实际上不是一个糟糕的问题,您可以通过使用 sychronize 和计数器来控制实例的数量,这种设计模式称为实例控制类,它是 Joshua Bloch 在“有效 Java”中提到的第一件事(第2章)

于 2013-09-18T16:41:21.207 回答
0

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

于 2013-09-18T16:41:55.407 回答