我在Java中实现了一个不可变系统。几乎每个类都是不可变的,它的效果比我预期的要好得多。
我的问题在于尝试发送事件。通常你会有一个事件源和一个事件监听器。源简单地持有对监听器的引用,并在事件发生时发送它。
但是使用不可变对象时,当你修改一个字段并创建一个新对象时,事件监听器引用会发生变化。因此,事件源将发送到一些已被垃圾回收的旧引用。
因此,出于这个原因,所有我的GUI类都是可变的,因为它们自然地使用了很多事件。但是我希望找到一种优雅的方式来处理事件,以便我也可以使它们成为不可变的。
编辑:如下是所需的示例代码。
我的问题在于尝试发送事件。通常你会有一个事件源和一个事件监听器。源简单地持有对监听器的引用,并在事件发生时发送它。
但是使用不可变对象时,当你修改一个字段并创建一个新对象时,事件监听器引用会发生变化。因此,事件源将发送到一些已被垃圾回收的旧引用。
因此,出于这个原因,所有我的GUI类都是可变的,因为它们自然地使用了很多事件。但是我希望找到一种优雅的方式来处理事件,以便我也可以使它们成为不可变的。
编辑:如下是所需的示例代码。
public final class ImmutableButton {
public final String text;
public ImmutableButton(String text) {
this.text = text;
}
protected void onClick() {
// notify listeners somehow, hoping they haven't changed
}
}
public final class ImmutableWindow {
public final ImmutableButton button;
public ImmutableWindow(ImmutableButton button) {
this.button = button;
}
protected void listenForButtonClick() {
// somehow register with button and receive events, despite this object
// being entirely recreated whenever a field changes
}
}