通过指针

时间:2015-05-26 14:10:47

标签: java pointers arraylist

请考虑以下代码:

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在它指向列表中的对象被删除时不会更新。还有一件事,我无法访问从列表中删除对象的方法。

3 个答案:

答案 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