数组不应由数组初始值设定项静态初始化。为什么?

2022-09-01 09:02:54

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

总结

数组不应由数组初始值设定项静态初始化。

描述

此审核规则检查使用数组初始值设定项初始化的数组变量(在初始值设定项中或在赋值语句中)。

由于使用了数组初始值设定项,将标记以下数组声明:

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

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


答案 1

这是一个有趣的问题,恕我直言,这个决定是毫无根据的。(我希望其他人会回答这个帖子,如果这个设计决定背后有合法的理由)。

此外,Google在其良好实践格式化指南 https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.8.3.1-array-initializers 中展示了如何格式化这些静态初始值设定项,而无需说明使用这些结构有多糟糕...

我猜想,这条规则背后的人只是对这种编程风格有一颗牙齿,:)


答案 2

我认为这是因为它是一种特殊的语法,仅在初始化时有效。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代码样式并不禁止这种形式的初始化,这在此示例中非常明显。