Axe*_*xel 7 java lambda listener methodhandle
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);
}
}
Run Code Online (Sandbox Code Playgroud)
随着lambda表达式和方法的引用,它已不再是需要有B落实PropertyChangeListner,我们可以写
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为新代码不仅更短,而且更简洁,更易于理解.但是在阅读了这里给出的答案之后(这个问题的副本,但我认为问题和答案更加清晰),我看不出有办法实现一个stopListening()可以再次删除监听器的方法.
我确信我不是第一个偶然发现这一点的人.那么有没有人找到一个很好的解决方案,如何使用方法句柄,如本例所示,并仍然能够在以后再次删除侦听器?
UPDATE
那很快.在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 -> {};
}
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式声明您的侦听器:
private final PropertyChangeListener myProperty1Listener = this::doSomething;
private final PropertyChangeListener myProperty2Listener = e -> doSomethingElse());
Run Code Online (Sandbox Code Playgroud)
然后,您可以添加您的侦听器:
// using method reference
a.addPropertyChangeListener( "Property1", myProperty1Listener );
// using lambda expression
a.addPropertyChangeListener( "Property2", myProperty2Listener );
Run Code Online (Sandbox Code Playgroud)
你可以删除它们:
a.removePropertyChangeListener( "Property1", myProperty1Listener );
a.removePropertyChangeListener( "Property2", myProperty2Listener );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2409 次 |
| 最近记录: |