请考虑以下代码:
ArrayClass<someClass> list = new ArrayList<someClass>();
//Consider this list has been filled somewhere else
someClass selectedObject = null;
public void userAction(float x, float y){
selectedObject = findObject(x, y);
}
public someClass findObject(float x, float y){
for(int i=0; i<list.size(); i++)
if( --objects match-- )
return list.get(i);
return null;
}
问题是我在其他地方使用了selectedObject,我需要知道它指向的对象仍然存在。我注意到当删除了selectObject指向的列表中的对象时,selectedObjects会保留其用于指向的对象的属性(不再存在)。从列表中删除对象后,我需要selectedObject指向null。我怎样才能做到这一点?
EDIT1:澄清一下,发布的代码有效,这不是问题。问题是指针selectedObject在它指向列表中的对象被删除时不会更新。还有一件事,我无法访问从列表中删除对象的方法。
答案 0 :(得分:3)
如果将selectedObject设为弱引用,则可以实现此目的:
WeakReference<someClass> selectedObject = null;
赋值:
selectedObject = new WeakReference<someClass>(findObject(x, y));
查询:
someClass v = selectedObject.get();
如果项目从列表中删除(并且未被任何其他“指针”引用),selectedObject get()方法将返回null
答案 1 :(得分:0)
如果您将对象放在List
中,JVM
将保留一个对象和两个引用,因此,如果您需要确保selectedObject
为空,请指定{{ 1}}找到时:
null
想一想:在您的代码中,您永远不会删除对象的所有所有引用,因为您至少需要一个返回它....
答案 2 :(得分:0)
您可以创建一个包装类,每次要访问实例时都会检查列表:
class WrapperClass {
private final List<SomeClass> list;
private final float x;
private final float y;
WrapperClass(List<SomeClass> list, float x, float y) {
this.list = list;
this.x = x;
this.y = y;
}
SomeClass get() {
return findObject();
}
private SomeClass findObject(){
for(int i=0; i<list.size(); i++)
if( object_match(x, y) {
return list.get(i);
}
return null;
}
}
而不是你所说的:
WrapperClass wp = new WrapperClass(list, 1, 2);
System.out.println(wp.get()); // returns instance contained in the list
list.clear();
System.out.println(wp.get()); // returns null