And*_*niy 20 java instance-variables default-value
我得到了指向官方Oracle文档的链接:https : //docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
据说:
默认值
声明字段时,不一定总是需要分配值。编译器会将已声明但未初始化的字段设置为合理的默认值。通常,此默认值将为零或null,具体取决于数据类型。但是,通常认为依赖于此类默认值是不好的编程风格。
我想强调这一部分:
但是,通常认为依赖于此类默认值是不好的编程风格。
但是,天哪,我想这是语言规范的基本组成部分,因为它知道实例变量具有默认值。如果即使在Java SE库源代码中也广泛使用它,那么到底为什么这是一种不好的编程习惯呢?
Gho*_*ica 19
简单:依赖默认值不会传达意图。
您是否真的希望该字段以0开头,还是忘记分配一个值?
当然,空引用是遇到空指针异常所需的两件事的一半。
最后,使用默认值意味着您具有非final字段。您尽可能避免使用。
唯一的反论点是:为什么记下不必要的东西?但是我认为列出的缺点是吹牛说的,因此将0显式分配给字段比将其留给编译器更好。
Mic*_*rry 12
为什么这在实践中是不好的编程习惯
这个想法是,如果您依赖默认值,那么如果您故意将其保留为默认值,或者只是忘记分配它,那么对阅读该代码的任何人都不会立即明白。
...如果它甚至在Java SE库源代码中也被广泛使用?
作为示例编码实践的示例,您实际上并不应该依赖Java源代码。在许多情况下,会违反此类规则(有时是有意改善性能,有时是偶然的,或者是因为多年来接受的样式已发生变化)。
引用的文字是:
“但是,通常认为依赖这种默认值是不好的编程风格。”
讽刺的是:“通常认为”通常是一种说法,即作者没有试图为所陈述的内容找到权威。
在这种情况下,断言显然是有问题的。证据:抽样的5种Java样式指南中有5种没有说明您是否应该或应该依赖默认值:
(请注意,我的抽样方法是查看Google的前5个不同搜索结果中的“ java样式指南”。然后我在每个文档中搜索“默认”。这不是一个详尽的分析,但可以用来说明我的观点。 )
好。那么,它真的有助于提高Java代码的可读性吗?
这值得商de。
一方面,尚未了解默认初始化的Java新手程序员可能对零或空值来自何处感到困惑。但是,如果他们费心寻找一个明确的初始化,却发现没有一个初始化,那应该足以使他们阅读一本教程或一本书以了解默认初始化。(您希望!)
另一方面,我们通常不希望Java新手维护生产代码库。对于有经验的Java程序员,冗余初始化不会提高可读性。(最多)是噪音。
在我看来,通过字段的冗余初始化唯一可以实现的事情是向代码的未来读者发信号,说明您已经考虑了初始值。(正如@GhostCat所表示的那样,默认初始化不会传达意图。)
但是相反,如果我是那个读者,我不一定会信任代码作者的想法。因此,这种“信号”的价值也值得怀疑。
可靠性呢?
在Java中没有区别。JLS 指定确实对字段进行默认初始化。相反,对于局部变量,尝试使用尚未明确初始化的变量是编译错误。
简而言之,未明确初始化的变量的运行时行为是完全可以预测的。
相反,在诸如C或C ++之类的语言中,可能不会初始化变量,因此行为未指定,并且可能导致崩溃以及不同平台上的行为差异。在这里始终显式初始化变量的情况要强得多。
性能如何?
它应该没有区别。JIT编译器应该能够将冗余初始化和默认初始化视为相同。