Java侦听器引用阻止垃圾收集?
我担心我的监听列表中可能会有很多不死生物 尽管可以简单地删除,但仍会收到通知 假设以下类别: 这是我的ListView,是一个UI组件,我使用addItem方法用对象填充列表。 过一会儿,我可能会调用clear删除列表中的每个项目: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
//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带来问题。