【发布时间】:2014-08-22 09:51:17
【问题描述】:
当我使用调用构造函数中可覆盖方法的 lambda 添加事件侦听器时,我收到警告。如果我使用方法引用,我不会收到任何关于可覆盖方法或泄漏的警告。我应该避免在构造函数中引用方法还是安全?
这是一个简单的例子:
public class SomeClass {
public SomeClass(SomeObj obj) {
obj.addListener(this::handleEvent); // no warnings, is it really safe?
obj.addListener((event) -> handleEvent(event)); // warning about overridable method in constructor
}
private void handleEvent(Event event) {
event.doSomething(someMethod());
}
private void someMethod() {
...
}
}
【问题讨论】:
-
我不确定(因此是评论,而不是回答)——但我看不出它如何是安全的。闭包必须包含
this引用,并且 afaik 在 lambdas 中没有特殊考虑。 -
@SotiriosDelimanolis 为什么这很重要?警告是因为线程问题以及
addListener可能会调用未完全构造的this上的方法。 -
@yshavit 给出的例子或多或少是等价的。如果其中一个没有发出警告,则可能只是缺少编译器功能(反之亦然)。
-
@SotiriosDelimanolis 当然,但这并不能回答它是否安全的问题。
-
@yshavit 请注意,他们提出的问题是假设 lambda 不安全,因为他们收到了警告。如果方法参考也有警告,他们可能不会问这个问题。如果他们在不同的编译器上尝试过这个,他们可能已经看到了警告并且没有任何疑问。此外,
the examples given are more or less equivalent暗示如果一个不安全,另一个也不安全。
标签: java constructor lambda java-8