在初始化之前通过getter访问最终字段

时间:2014-08-29 12:47:47

标签: java compiler-errors

首先,这个问题与这些好问题有着前瞻性的关系:

1)Use of uninitialized final field - with/without 'this.' qualifier

2)Why isn't a qualified static final variable allowed in a static initialization block?

但我会以另一种视角来问它。只是为了记住:上面提到的问题是关于使用final中的关键字this访问Java 7字段的问题。

在我的问题中,有类似的东西,但不一样。好吧,请考虑以下代码:

public class TestInit {
    final int a;
    {
        // System.out.println(a);   -- compile error
        System.out.println(getA());
        // a = a;                   -- compile error
        a = getA();
        System.out.println(getA());
    }
    private int getA() {
        return a;
    }
    public static void main(String[] args) {
        new TestInit();
    }
}

输出是:

0
0

正如你所看到的,这里有两个不明确的事情:

  1. 还有另一种合法方式可以访问未初始化的final字段:使用其getter。
  2. 我们是否应该将空白最终字段的分配a = getA();视为合法,并始终为其分配默认值,例如非final字段JLS?换句话说,它应该被视为预期行为吗?

1 个答案:

答案 0 :(得分:0)

您真正遇到的是编译器的推理能力。 对于您的第一个编译器错误,该失败,因为编译器肯定知道a未分配。与第二个a = a相同(你不能从a分配,因为它在那个时候肯定没有分配)。 工作a = getA()的行是a的第一个,单个,明确的赋值,因此很好(无论值来自何处; getA()的实现都不重要且不是&# 39;此时评估)。

方法getA()有效且可以返回a,因为实例初始值设定项已明确为a赋值。

对于看待它的人来说这是有意义的,但它不是编译器内置的推理。每个独立评估的块都有效。