我知道:
一个空白的最终类变量必须由声明它的类的静态初始化程序明确分配,否则会发生编译时错误。
必须在声明它的类的每个构造函数的末尾明确分配一个空白的最终实例变量,否则会发生编译时错误。
为什么最终变量不能在任何时候只分配一次,而不仅仅是在声明时?
我知道:
一个空白的最终类变量必须由声明它的类的静态初始化程序明确分配,否则会发生编译时错误。
必须在声明它的类的每个构造函数的末尾明确分配一个空白的最终实例变量,否则会发生编译时错误。
为什么最终变量不能在任何时候只分配一次,而不仅仅是在声明时?
对于非final
变量,此推论是变量的初始值。每个字段根据其类型接收一个初始值——通常是0
or的变体null
。
It's implied here that, if you're declaring a variable to be final
, then you have a specific value in mind that you wish that variable to be assigned and not have changed later in its run. Java doesn't know what value that is, and it likely takes away the convenience of automatically declaring those values for you so to not interfere with the developer's intentions.
That and requiring that all final
variables be initialized is to support all variables being definitely assigned before their use. You can use a non-final
field that you don't initialize to some value - it'll likely be null
though - but you can't use a local variable that you haven't initialized yet for the same reason.
First it is not something against null. The following is legal too:
final String ABC;
{
ABC = null;
}
static final String DEF;
static {
DEF = null:
}
final String GHI = null;
这是以下决定:
当最终字段或局部变量未初始化时,它很可能是一个错误,忘记初始化。(对于普通字段,这将是太多的锅炉代码,并且提供了字段的归零。)
对于局部变量,您可能会发现这一点很明显。由于最终变量只能分配一次,并且决定这只应在构造期间发生(否则您将需要管理变量是否已初始化)。
语言设计决策总是在灵活性和错误预防之间进行权衡。在这种情况下,有一些简单的问题需要检查:
final
如果存在未分配变量的代码路径:
final
开发人员声明一个变量只是为了保存默认值或null
的可能性有多大?0
false
我认为,试图回答这些问题应该导致这个设计决策背后的基本原理。
这是一个重要的澄清的地方。对于局部变量,所有变量必须在使用前进行初始化。仅对非final
堆变量、读取、字段和数组元素解除限制。
在数组的情况下,当数组可以被实例化为最多 2³¹ 个元素时,为什么不强制开发人员编写显式默认值应该是显而易见的。对于非final
实例字段,可以讨论这个决定。但是这样的讨论超出了 Stackoverflow 的范围……</p>