Java侦听器引用阻止垃圾收集?

Java侦听器引用阻止垃圾收集?,java,garbage-collection,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 ad

我担心我的监听列表中可能会有很多不死生物 尽管可以简单地删除,但仍会收到通知

假设以下类别:

这是我的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。它保存对模型对象的引用,并负责在其控制的ListCell中设置正确的内容。 控制器将自身设置为模型对象中的侦听器:

//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从不保存对控制器对象的任何引用,只保存对ListCells的引用。如果清除ListView,则会丢弃对ListCells的所有引用

列表单元格不知道它们当前是否显示或已被丢弃,当然控制器也不知道

我假设,现在,即使ListView为空,Model对象仍然保存对_listeners列表中控制器的引用。因此,控制器不会被垃圾收集,因此ListCell也不会被垃圾收集

这是否意味着,如果我从我的ListView中添加和删除很多项,我将得到一个巨大的侦听器列表?如果我不知道是否显示ListCell,如何避免这种情况

TL;博士:
我的_侦听器列表会阻止控制器和ListCell的垃圾收集吗?

很抱歉,我不太了解您的问题是什么,但就我所知的垃圾收集,即使两个对象相互引用,如果在运行时没有引用,它们也会被删除

所以,若您的问题与此有关,若您在运行时至少引用了一个侦听器,它将不会被垃圾收集,因此,您必须手动删除它


我希望我能有所帮助。

循环引用不会给Java GC带来问题。