为什么数组不应该通过数组初始化器进行静态初始化?

33

这是来自Google静态分析器CodePro AnalytiX的规则之一:

概述

不应该使用数组初始化器对数组进行静态初始化。

描述

此审核规则检查使用数组初始化器对数组变量进行初始化(无论是在初始化程序中还是在赋值语句中)的情况。

示例

以下数组声明将被标记,因为使用了数组初始化器:

int[] values = {0, 1, 2};

现在,如果我不喜欢它,我可以禁用它,这不是问题。但我想知道为什么会有问题,以及避免该代码被审计规则标记的解决方案是什么?


6
似乎有一堆预定义的规则,只是关于个人喜好的问题,这样你就可以轻松地进行配置。查看此列表,我发现很多规则对我来说既没有根据,甚至有些可疑。 - Holger
审计检查器是否会抱怨数组是const?也许他们不希望可修改的值进入除动态堆存储之外的任何地方,因为可能会导致缓冲区溢出,从而导致安全漏洞。 - Marty
2个回答

16

这是一个有趣的问题,而且在我看来,这个决定是没有根据的。(如果这种设计决策背后有合法的原因,我希望其他人能够回答这个帖子)。

此外,Google在他们的良好实践格式指南中展示了如何格式化这些静态初始化器 https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.8.3.1-array-initializers,没有说使用这些构造的坏处...

我猜背后的那个人只是对这种编程风格有偏见:)


3
我不否认,我将其发布为答案是因为相比评论更易于阅读。此外,我猜想人们只能对此进行推测,因为我没有找到任何解释这个决定背后原因的来源。 - Loïc Gammaitoni
1
我认为它实际上在某种程度上回答了问题:“但我想知道为什么这会成为一个问题,以及推荐的最佳做法是什么?”根据Google样式指南,这是允许的。 - Magnilex
1
相关的部分是,“Google在其良好实践格式指南中展示了如何格式化这些静态初始化程序”,尽管他们的分析器将其排除在外。该链接只是一个参考,不必理解我的观点。 - Loïc Gammaitoni
2
我的观点是,由于Google实际上指定了数组的初始化应该按照他们的指南进行,所以根据他们的指南,OP的问题“这会有问题吗...”得到了回答。Google认为这是可以接受的,但在CodePro AnalytiX中实施了一个可选规则。因此,我给出了这个答案的+1。 - Magnilex
感谢@Magnilex的支持,看起来那些评论现在已经被删除的人会以格式不佳或与主题无关为借口抨击任何人以获取声誉...他们的评论是唯一与该主题无关的东西...很遗憾... - Loïc Gammaitoni

11

我想这是因为它是一种特殊的语法,只有在初始化 values 时才起作用。

int[] values = {1,2,3} //legal

int[] values2;
values2 = {1,2,3} //not legal


int [] values3; 
values3 = new int[]{1,2,3} //legal

最后一种形式values3无论是在创建数组时还是以后,都是合法的。因此,与其混合初始化数组的形式,最好始终使用相同的形式。在我看来,这样可以使代码更清晰,符合最少意外原则。

不过奇怪的是,Google代码风格指南并没有禁止这种初始化形式,在这个示例中非常清楚。


1
“Array Initializer”确实是由JLS专门用于{values}部分,但是new int[]{1,2,3}仍然使用数组初始化器作为“数组创建表达式”的一部分”(https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.10)。问题是,分析器是否意味着相同的事情? - zapl
一个相关的问题:https://dev59.com/r2435IYBdhLWcg3wfQF9 - Vitalii Fedorenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接