在构造函数中为 lambda 的情况下的“this”引用转义

Man*_*pal 3 java concurrency java-8

关于这个问题 -

对外部类的“this”引用如何通过发布内部类实例来转义?

如果我们用 lambda 或方法引用替换匿名类,那么这段代码为什么以及如何表现?

public class ThisEscape {
    public ThisEscape(EventSource source) {
         source.registerListener(e -> doSomething(e));
    }
}
Run Code Online (Sandbox Code Playgroud)

dpr*_*dpr 5

从技术上讲,创建匿名内部类或使用 lambda 没有太大区别。Lambda 不仅仅是语法糖果,它使 Java 一直能够做的事情更加突出、易于访问且不易出错。也就是说,您的代码受制于您提到的问题及其答案中描述的相同竞争条件。

使用给定的代码构造,您无法保证ThisEscapedoSomething调用之前正确创建了实例。

阅读此答案中链接的 javaspecialists.eu 时事通讯,了解在哪些情况下可能会出现问题。

  • Lambda 不仅仅是语法糖。但是,当然,只要操作保持“注册一个将调用`doSomething`的侦听器”,基本问题就保持不变,因为它们是操作固有的,而不是其实现方式。 (3认同)