gpt4 book ai didi

java - 如何删除用作监听器的 lambda 表达式/方法句柄?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:01 24 4
gpt4 key购买 nike

Java 8 引入了 lambda expressions ,这是一件好事。但现在考虑重写这段代码:

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 实现 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);
}
}

我认为新代码不仅更短,而且更清晰、更易于理解。但是看完给出的答案here (重复 this 一个,但我认为问题和答案更清晰),我看不出有什么方法可以实现名为 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 -> {};
}

最佳答案

您可以按如下方式声明您的监听器:

private final PropertyChangeListener myProperty1Listener = this::doSomething;
private final PropertyChangeListener myProperty2Listener = e -> doSomethingElse());

然后,您可以添加您的监听器:

// using method reference
a.addPropertyChangeListener( "Property1", myProperty1Listener );
// using lambda expression
a.addPropertyChangeListener( "Property2", myProperty2Listener );

你可以删除它们:

a.removePropertyChangeListener( "Property1", myProperty1Listener );
a.removePropertyChangeListener( "Property2", myProperty2Listener );

关于java - 如何删除用作监听器的 lambda 表达式/方法句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42146360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com