问题描述
像所有对象一样,当匿名内部类的最后一个引用不再引用它时,该匿名内部类也有资格进行垃圾回收。我在这里使用狡猾的措辞,因为Java不保证所有事情都会被垃圾回收–唯一的保证就是只要有参考就不会发生。
在这种特殊情况下,那将是projectSettings
a removePropertyListener()
或本身被垃圾收集的时候。
因为projectSettings
引用了匿名内部类,并且因为内部类引用了它的包含类,所以这意味着包含类也将至少与内部类一样长。
解决方法
在对象生命周期的什么时候使用匿名内部类作为PropertyChangeListener时,将收集类的垃圾?回收包含的类(SettingsNode)之后?是否应该在包含类(SettingsNode)的终结器中显式删除PropertyChangeListener?
public class SettingsNode extends AbstractNode
{
public SettingsNode(Project project,ProjectSettings projectSettings)
throws IntrospectionException
{
// use an anonymous inner class to listen for changes
projectSettings.addPropertyChangeListener(ProjectSettings.PROP_NAME,new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent evt)
{
// handle event
}
});
}
}