Java 8 引入了Lambda表达式,这是一个很好的功能。但现在考虑重写以下代码:
class B implements PropertyChangeListener {
void listenToA(A a) {
a.addPropertyChangeListener(this);
}
void propertyChange(PropertyChangeEvent evt) {
switch(evt.getPropertyName()) {
case "Property1":
doSomething();
break;
case "Property2":
doSomethingElse(); case "Property1":
doSomething;
break;
break;
}
void doSomething() { }
void doSomethingElse() { }
}
class A {
final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
void addPropertyChangeListener(PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}
void removePropertyChangeListener(PropertyChangeListener listener) {
pcs.removePropertyChangeListener(listener);
}
}
使用 lambda 表达式和方法引用,不再需要让 B
实现 PropertyChangeListener
接口,因为我们可以这样写:
class B {
void listenToA(A a) {
// using method reference
a.addPropertyChangeListener("Property1", this::doSomething);
// using lambda expression
a.addPropertyChangeListener("Property2", e -> doSomethingElse());
}
void doSomething(PropertyChangeEvent evt) { }
void doSomethingElse() { }
}
class A {
final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
void addPropertyChangeListener(String name, PropertyChangeListener listener) {
pcs.addPropertyChangeListener(name, listener);
}
void removePropertyChangeListener(String name, PropertyChangeListener listener) {
pcs.removePropertyChangeListener(name, listener);
}
}
我认为新代码不仅更短,而且更清晰易懂。但是在阅读这里给出的答案后(与这个问题的重复,但我认为问题和答案更简洁),我看不到实现名为stopListening()
的方法来移除侦听器的方法。
我相信我不是第一个遇到这个问题的人。那么有没有人发现了一个好的解决方案,可以像这个示例中显示的那样使用方法句柄,并且仍然能够稍后再次删除侦听器呢?
更新
很快就有结果了。在借鉴Mike Naklis和Hovercraft Full Of Eels的答案的基础上,我最终得到了以下内容:
class B {
void listenToA(A a) {
a.addPropertyChangeListener("Property1", doSomething);
a.addPropertyChangeListener("Property2", doSomethingElse);
}
final PropertyChangeListener doSomething = evt -> {};
final PropertyChangeListener doSomethingElse = evt -> {};
}
B
实例有关,我不能在我的程序中将它们设为静态的。 - Axelevt.source
是什么? - ZhongYuA
。 - Axel