我正在初始化一个对象,在构造函数中,我正在传递一个lambda。在lambda中,我想访问我正在初始化的对象。
MyObject obj = new MyObject(params -> {
this.xyz(); //Tries to access scope of class surrounding obj
MyObject.this.xyz(); //Error: 'MyObject' is not a surrounding class
obj.xyz(); //Error: Variable 'obj' might not have been initialized.
});
示例MyObject
类:
public class MyObject {
//Missing constructor
public void xyz(){
//Do stuff
}
}
如果可能,我宁愿不将this
传递给lambda。
如果有办法做一个"临时最终变量",我找不到它。
答案 0 :(得分:2)
你不能这样做,因为编译器必须假设构造函数将充分利用lambda,即它可能会调用它。
在这种情况下,必须将调用xyz()
路由到尚未初始化的对象; Java编译器不允许这样做。
这样做的解决方法是说服Java在构造期间不打算使用部分初始化的对象。您可以先构建对象,然后再设置lambda:
MyObject obj = new MyObject();
obj.setLambda(params -> { obj.xyz(); });
这种解决方法的一个不幸后果是lambda变量无法在final
类中标记为MyObject
。