初始化字段时引用'this'是否可以?

时间:2010-04-21 01:25:48

标签: java

初始化字段时引用this是否可以?

public class MainClass {

  private SomeFieldClass field = new SomeFieldClass(this);

  public MainClass() {}

}

或者在构造函数中更好吗?

public class MainClass {

  private SomeFieldClass field;

  public MainClass() {
    this.field = new SomeFieldClass(this);
  }

}

最佳做法是什么?我相信第一个选项更适合单元测试和依赖注入。这有什么问题吗?

3 个答案:

答案 0 :(得分:4)

在构造函数完成执行之前让this引用转义(问题中的两个样式)在多线程应用程序中是错误的(1)和(2)当MainClass被扩展时。 / p>

答案 1 :(得分:4)

这个问题有点不清楚。您是否担心将此传递给构造函数,或者在构造函数体中使用this.field,或者在构造函数中而不是在类体中初始化字段?

我个人更喜欢在引用类成员时使用此前缀,但这是一个样式问题。

我也不想在类体中初始化非常量。我发现对于更长的类,最好将所有初始化都放在一个集合位置(例如构造函数)中,而不是在视觉上扫描声明以识别初始值。

如果您要求尽早传递(两个示例中的问题),我觉得这取决于您是否可以处理目标使用部分初始化对象执行某些操作的可能性。我更喜欢将这些创建分离为不同的显式调用函数(例如,createAssociatedSomeObject())

答案 2 :(得分:2)

两者都可以接受。但是,如果你可以抛出一个可以处理的异常,你就会使用第二个。我推荐第二个,因为它将inIitalisation定位到一个地方,也可以从其他构造函数调用。