Подтвердить что ты не робот

Массивы не должны быть статически инициализированы инициализатором массива. Зачем?

Это одно из правил статического анализатора Googles CodePro AnalytiX:

Резюме

Массивы не должны быть статически инициализированы инициализатором массива.

Описание

Это правило аудита проверяет инициализацию переменных массива (либо в инициализаторе, либо в операторе присваивания) с использованием инициализатора массива.

Пример

Следующее объявление массива будет помечено из-за использования инициализатора массива:

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

Теперь я могу отключить его, если мне это не нравится, это не проблема. Но я задаюсь вопросом, почему это будет проблемой, и каково было бы решение о том, чтобы этот код не был отмечен правилом аудита?

4b9b3361

Ответ 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 имеет юридическую силу при создании массива или позже. Поэтому вместо того, чтобы смешивать формы инициализирующих массивов, вам лучше использовать одну и ту же форму. IMHO, который обеспечивает более четкий код, следуя принципу наименьшего удивления.

Странно, хотя стиль кода Google не запрещает эту форму инициализации, которая очень понятна в этом пример.