如何访问"这个"从构造函数参数范围?

时间:2016-01-25 00:20:59

标签: java

我正在初始化一个对象,在构造函数中,我正在传递一个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。

如果有办法做一个"临时最终变量",我找不到它。

1 个答案:

答案 0 :(得分:2)

你不能这样做,因为编译器必须假设构造函数将充分利用lambda,即它可能会调用它。

在这种情况下,必须将调用xyz()路由到尚未初始化的对象; Java编译器不允许这样做。

这样做的解决方法是说服Java在构造期间不打算使用部分初始化的对象。您可以先构建对象,然后再设置lambda:

MyObject obj = new MyObject();
obj.setLambda(params -> { obj.xyz(); });

这种解决方法的一个不幸后果是lambda变量无法在final类中标记为MyObject