gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:51:31 24 4
gpt4 key购买 nike

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

最佳答案

这在 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();

并且由于 target 是对 ExppressiveObject唯一引用,而它现在已经消失了,我们知道它现在是垃圾,并且将被当垃圾收集器注意到时丢弃。

<小时/>

进一步说明:

ExpenseObjectExppressiveObjectHolder 实现相同的接口(interface)可能会很有用,但这也可能会让您更容易忘记在应该使用的位置使用持有者。

如果ExpectiveObject具有执行诸如return this;之类的方法,请确保持有者中的方法返回持有者。

关于java - 我们如何将与java中的对象关联的所有引用设置为null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24189284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com