依赖默认字段初始化-编程风格不好吗?[关闭]


20

我获得了指向官方Oracle文档的链接:https : //docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

据说:

默认值

声明字段时,不一定总是需要分配值。编译器会将已声明但未初始化的字段设置为合理的默认值。通常,此默认值将为零或null,具体取决于数据类型。但是,通常认为依赖于此类默认值是不好的编程风格。

我想强调这一部分:

但是,通常认为依赖于此类默认值是不好的编程风格。

但是,天哪,我想这是语言规范的基本组成部分,因为它知道实例变量具有默认值。如果即使在Java SE库源代码中也广泛使用它,那么到底为什么这是一种不好的编程习惯呢?


5
嗯 我不知道那句话在那儿。实际上,我认为依靠它们是一种好习惯。 private int count = 0;是什么都不做的代码,什么也不做的代码很混乱。这就像从java.lang导入类,或使用声明一个类extends Object
VGR

2
...或public abstract在界面中有方法。
mumpitz

1
公共摘要有什么问题?
约翰·基茨

1
难题可能来自C ++。它是一种流行的语言,它对默认初始化和零初始化的处理是持续不断的错误来源。在C ++中,除了最特殊的情况外,在所有情况下都依赖默认值是一个不明智的主意。从文化上讲,这可能已经泄漏到Java中了。
科特·阿蒙

@JohnKeates-我的Java有点生锈,但是private接口中的方法没有任何意义,而且abstract是隐含的。
斯科特·史密斯

Answers:


6

引用的文字是:

“但是,通常认为依赖这种默认值是不好的编程风格。”

讽刺的是:“通常认为”通常是一种说法,即作者没有试图为所陈述的内容寻找权威。

在这种情况下,断言显然是有问题的。证据:抽样的5种Java样式指南中有5种没有说明您是否应该或应该依赖默认值:

(请注意,我的抽样方法是查看Google的前5个不同搜索结果中的“ java样式指南”。然后我在每个文档中搜索“默认”。这不是一个详尽的分析,但它可以说明我的意思。 )


好。那么,它真的有助于提高Java代码的可读性吗?

这值得商de。

一方面,尚未了解默认初始化的Java新手程序员可能对零或空值来自何处感到困惑。但是,如果他们费心寻找一个明确的初始化,却发现没有一个初始化,那应该足以使他们阅读一本教程或一本书以了解默认初始化。(您希望!)

另一方面,我们通常不希望Java新手维护生产代码库。对于有经验的Java程序员,冗余初始化不会提高可读性。(最多)是噪音。

在我看来,通过字段的冗余初始化唯一可以实现的事情是向代码的未来读者发信号,说明您已经考虑了初始值。(正如@GhostCat所表示的那样,默认初始化不会传达意图。)

但是相反,如果我是那个读者,我不一定会信任代码作者的想法。因此,这种“信号”的价值也值得怀疑。


可靠性呢?

在Java中没有区别。JLS 指定确实对字段进行默认初始化。相反,对于局部变量,尝试使用尚未明确初始化的变量是编译错误。

简而言之,未明确初始化的变量的运行时行为是完全可以预测的。

相反,在诸如C或C ++之类的语言中,可能不会初始化变量,因此行为未指定,并且可能导致崩溃以及不同平台上的行为差异。在这里始终显式初始化变量的情况要强得多。


性能如何?

它应该没有区别。JIT编译器应该能够将冗余初始化和默认初始化视为相同。


19

简单:依赖默认值不会传达意图。

您是否真的希望该字段以0开头,还是忘记了分配一个值?

当然,空引用是遇到空指针异常所需的两件事的一半。

最后,使用默认值意味着您具有非final字段。您尽可能避免使用。

唯一的反论点是:为什么记下不必要的东西?但是我认为上面列出的缺点是吹牛说的,因此将0显式分配给字段比将其留给编译器更好。


3
即re:不传达意图-如果“维护者保姆”正在查看您的代码并且不知道特定数据类型的默认值是什么,该怎么办。他假设当它实际上为NULL时为0,这就是===检查(或Java中对value&type的等效检查是否相等,等于equals()的全部错误)的全部错误。(对于一个没有经验的程序员)数小时的搜索可能是这么简单的结果。PS试图扮演恶魔的拥护者。我说一整天都使用默认值(即使我从未使用过),并让更聪明的人(或至少对细节更加关注)来维护您的代码。
TCooper

@TCooper当维护者Mannie确实对Java知之甚少时,那么他就没有涉及实际Java代码的事务。但是我同意这个基本概念。对于新手来说,事情变得更加艰难。
GhostCat向Monica C致敬。

12

为什么这在实践中是不好的编程习惯

这个想法是,如果您依赖默认值,那么如果您故意地阅读代码,那么任何人都不会立即明白保留为默认值,或者只是忘记了分配它。

...如果它甚至在Java SE库源代码中也被广泛使用?

作为示例编码实践的示例,您实际上并不应该依赖Java源代码。在许多情况下,会违反此类规则(有时是有意改善性能,有时是偶然的,或者是因为多年来接受的样式已发生变化)。


2
这可能是对的,尽管我不同意。
VGR

3
@VGR尽管我倾向于同意依赖默认值是次优的说法,但出于这个原因,我还是谨慎地以中立的方式表达了它。代码质量是主观的,我很清楚这绝不是普遍接受的观点。
迈克尔·贝里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.