删除引用并更改方法中的静态变量

时间:2020-03-19 14:48:34

标签: java

假设我们有一个对象和一个静态变量,用于统计生成的对象

variable = new Foo();
Foo.getObjCounter(); // -> 1

java中是否有放置此代码的方法:

variable = null;
Foo.decreaseFooCounter();

进入一种方法,例如:

variable.delete();
Foo.getFooCounter(); // -> 0

Foo.delete(variable);
Foo.getFooCounter(); // -> 0

1 个答案:

答案 0 :(得分:1)

您可以通过使用WeakReferences或更具体地由Set支持的WeakHashMap来实现这种行为。请参见以下示例:

class Foo {
    private static final Set<Foo> references = Collections.newSetFromMap(new WeakHashMap<>());

    public Foo() {
        references.add(this); // register ourselves
    }

    public static int getFooCounter() {
        return references.size();
    }

    // rest of the methods
}

尽管仅当垃圾收集器释放了对创建的Foo的引用时,才会删除它们。引用文档:

[...]假设垃圾收集器在某个时间点确定对象是弱可访问的。到那时,它将自动清除对该对象的所有弱引用 [...]