Java Listener引用可以防止垃圾回收?

时间:2014-06-11 16:15:00

标签: java garbage-collection

我担心我的监听器列表中可能会出现很多“不死”对象 即使它们可以被删除,仍然会得到通知。

假设以下类:

这是我的ListView,一个UI组件,我使用addItem方法用对象填充列表。 过了一会儿,我可以打电话给clear删除列表中的每个项目:

//Displays some Model objects
ListView
{
    //Creates a new Cell via createCell and adds the Cell to the ItemList
    public void addItem(MyModelObject obj) { ... }
    //Simply cleares the ItemList
    public void clear() { ... }

    ...

    //Creates a new Cell to be added to the ListView
    private ListCell createCell(MyModelObject obj)
    {
        //Create the Controller for the Cell and return the Cell
        return new ListCellController(obj).getCellUI();
    }
}

这是上面createCell方法中看到的ListCellController。它保存对Model Object的引用,并负责在它控制的ListCell中设置正确的内容。 Controller将自己设置为模型对象中的监听器:

//Handles the Content that is displayed in a ListCell
ListCellController implements MyModelObjectListener
{
    private final ListCell _ui = ...

    public ListCellController(MyModelObject obj)
    {
        obj.addListener(this); //Get informed if Model Object changes
        _ui.setText(obj.getName()); //Control what is displayed in the Cell
    }

    //Returns the UI Object that is controlled by this Controller
    public ListCell getCellUI() { return _ui; }

    ...
}

这是模型对象,它会做一些事情,偶尔会通知听众是否有变化。

//My Model Object that informs listeners if it changed
MyModelObject
{
    private List<MyModelObjectListener _listeners = ...;

    ...
    public void addListener(MyModelObjectListener listener) { ... }
}

现在,如果我将一些项添加到ListView然后清除它会发生什么? ListView永远不会保存对Controller对象的任何引用,仅对ListCells。如果清除ListView,则丢弃对ListCell的所有引用。

ListCells不知道它们当前是显示还是已经丢弃,当然Controller也不知道。

我假设,现在,即使ListView为空,模型对象仍然保存_listeners列表中对控制器的引用。因此,控制器不是垃圾收集的,因此ListCells都不是。

这是否意味着,如果我从ListView中添加和删除大量项目,我最终会得到一个庞大的听众列表?如何避免这种情况如果我不知道是否显示ListCell?

TL; DR: 我的_listeners列表会阻止控制器和ListCell的垃圾收集吗?

1 个答案:

答案 0 :(得分:0)

对不起,但我不太清楚你的问题是什么,但是对于我对垃圾收集的了解,即使两个对象互相引用,如果在运行时都没有引用它们,无论如何它们都会被删除。

因此,如果您的问题与此有关,如果您在运行时至少引用了一个侦听器,则不会进行垃圾回收,因此,您必须手动将其删除。

我希望我可以提供任何帮助。