Должен ли MAIN метод копировать входные аргументы?

Может ли кто-нибудь представить, когда этот код:

public static void main(final String[] args) {
   // do something
}

должно стать следующим:

public static void main(final String[] args) {
   String[] argsCopy = doCopy(args);
   // do something
}

(В нашей компании у нас есть правило сонара, которое заставляет такие справки или аргументы для всех методов.) Я могу себе представить, почему это может быть важно для стандартных методов, но я не могу найти никакой пользы от его создания в начале инструмента основной метод. Я что-то пропустил?

Ответ 1

Причина, по которой вы копируете параметры массива, заключается в том, чтобы избежать возможности модификации массива кем-либо после проверки его элементов. Это очень хорошая защитная техника, которая защищает вас от вредоносных вызовов в вызывающем абоненте.

Однако в этом случае вызывающий сам является JVM. Если вы не доверяете JVM, чтобы быть свободным от вредоносного кода, у вас гораздо большая проблема, чем то, что можно было бы решить, скопировав массив.

Единственным исключением является передача args в некоторые из ваших функций. В этом случае создание копии - очень хорошая идея, если какой-то метод решает изменить содержимое args. Это единственный случай, когда я рекомендовал бы сделать копию. Если main - единственное место, где используется args, создание копии не требуется.

Ответ 2

Я могу себе представить, что два наиболее очевидных (для меня):

  • Если вы их изменяете, но все равно нужно ссылаться на исходные значения
  • Если вы используете main как "обычный" метод, например, не просто вызванный из командной строки

В общем, однако, это не супер-полезно в этом случае.