我们如何设置与java中的对象关联的所有null引用?

时间:2014-06-12 16:19:22

标签: java object memory reference garbage-collection

我有一个对象的N引用。我想将指向此对象的所有引用设置为null。我不知道有多少引用指向这个对象。

1 个答案:

答案 0 :(得分:1)

这在Java和大多数其他现代语言中是特别不可能的。如果是这样,那将会破坏其他对象的不变量,例如包含对象的集合(例如,如果哈希表包含它作为键),这将是一件非常危险的事情。

但是,如果你想确保一个昂贵的物品在你想要的时候迅速消失,你可以使用一个简单的模式来确保它。

// This could also be some built-in class rather than one you write
class ExpensiveObject {
    // ... fields holding giant arrays, external resources, etc etc go here ...

    void someOperation() {
        // ... code ...
    }
}

class ExpensiveObjectHolder {
    ExpensiveObject target;

    ExpensiveObjectHolder(ExpensiveObject target) {
        this.target = target;
    }

    void someOperation() {
        if (target == null) {
            throw new IllegalStateException(
                "This ExpensiveObject has been deleted.");
        } else {
            target.someOperation();
        }
        // You can also omit this if/else and just let target.someOperation()
        // throw NullPointerException, but that might be annoying to debug.
    }

    void delete() {
        target = null;
    }
}

然后围绕对象创建包装器:

ExpensiveObjectHolder h = new ExpensiveObjectHolder(new ExpensiveObject());

当你希望它消失时,你会这样做:

h.delete();

并且targetExpensiveObject唯一引用,现在已经消失了,我们知道它现在是垃圾,当垃圾收集器通知时会被丢弃


补充说明:

使ExpensiveObjectExpensiveObjectHolder实现相同的界面可能会有用,但这也可以让您更容易忘记在应有的位置使用持有者。

如果ExpensiveObject的方法与return this;类似,请确保持有者中的方法返回持有者。