gpt4 book ai didi

Java Lambda 引用封闭对象 : Replace with Private Static Class?

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:41 25 4
gpt4 key购买 nike

从其封闭范围引用元素的 Java lambda 持有对其封闭对象的引用。一个人为的例子,lambda 持有对 MyClass 的引用:

class MyClass {
final String foo = "foo";
public Consumer<String> getFn() {
return bar -> System.out.println(bar + foo);
}
}

如果 lambda 的生命周期很长,这是有问题的;然后我们有一个长期存在的 MyClass 引用,否则它会超出范围。在这里,我们可以通过用私有(private)静态类替换 lambda 来进行优化,这样我们就只持有对我们需要的字符串的引用,而不是对整个类的引用:

class MyClass {

private static class PrintConsumer implements Consumer<String> {

String foo;

PrintConsumer(String foo) {
this.foo = foo;
}

@Override
public void accept(String bar) {
System.out.println(bar + foo);
}
}

final String foo = "foo";

public Consumer<String> getFn() {
return new PrintConsumer(foo);
}
}

不幸的是,这是非常冗长的,并且破坏了我们通过使用 lambda 封闭范围内的(有效最终的)变量获得的良好语法。这在技术上是最优的吗?在漂亮的语法和保持 ref 比必要的时间更长的可能性之间总是存在权衡吗?

最佳答案

首先将您的成员分配给局部变量:

class MyClass {
final String foo = "foo";
private Consumer<String> getFn() {
String localFoo = foo;
return bar -> System.out.println(bar + localFoo);
}
}

现在,lambda 只捕获 getFn() 内部的局部变量。 MyClass.this 不再被捕获。

另一个选项,稍微冗长一点,委托(delegate)给辅助方法:

class MyClass {
final String foo = "foo";
private Consumer<String> getFn() {
return getFn(foo);
}
private static Consumer<String> getFn(String localFoo) {
return bar -> System.out.println(bar + localFoo);
}
}

关于Java Lambda 引用封闭对象 : Replace with Private Static Class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36187451/

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