Должен ли 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
как "обычный" метод, например, не просто вызванный из командной строки
В общем, однако, это не супер-полезно в этом случае.