在java构造函数中初始化final变量

Spa*_*vić 2 java data-structures

可以说我有这样的情况。

private final A a;
private final B b;
private final C c;
private ClassX(){
  this.c = createCSomehow();
}
public ClassX(A a){
  this();
  this.a = a;
  this.b = null;
}
public ClassX(B b) {
  this();
  this.b = b;
  this.a = null;
}
Run Code Online (Sandbox Code Playgroud)

为什么 Idea 会抱怨 a 和 b 属性?想法在它们下面划线并说:变量 a 可能尚未初始化。我确信我没有更多的构造函数,并且在每种情况下 a 都会填充一些值。

sp0*_*00m 6

我真的不知道如何正确回答为什么(需要 JLS 调查),但是对于如何,应该编译以下内容:

private final A a;
private final B b;
private final C c = createCSomehow();

public Main(A a){
  this.a = a;
  this.b = null;
}

public Main(B b) {
  this.b = b;
  this.a = null;
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为原因是因为第一个私有构造函数没有正确初始化对象。因此我们有一个不正确的(即使是私有的)构造函数。 (3认同)

小智 6

根据 JLS 规范\n http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.3.1.2

\n\n

必须在声明它的类的每个构造函数 (\xc2\xa78.8) 的末尾明确分配一个空白的最终实例变量 (\xc2\xa716.9);否则会发生编译时错误。\n这就是 Idea 抱怨的原因。

\n