我有一个对象的N引用。我想将指向此对象的所有引用设置为null。我不知道有多少引用指向这个对象。
答案 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();
并且target
是ExpensiveObject
的唯一引用,现在已经消失了,我们知道它现在是垃圾,当垃圾收集器通知时会被丢弃
补充说明:
使ExpensiveObject
和ExpensiveObjectHolder
实现相同的界面可能会有用,但这也可以让您更容易忘记在应有的位置使用持有者。
如果ExpensiveObject
的方法与return this;
类似,请确保持有者中的方法返回持有者。