Frage sollte die MAIN-Methode Eingabeargumente kopieren?


Kann sich jemand vorstellen, wenn dieser Code:

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

sollte das werden:

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

(In unserer Firma haben wir eine Sonar-Regel, die solche Coping oder Argumente für alle Methoden erzwingt.) Ich kann mir vorstellen, warum dies für Standardmethoden wichtig sein kann, aber ich kann keinen Nutzen davon finden, dass es zu Beginn der Tools-Hauptmethode gemacht wird. Fehle ich etwas?


10
2017-09-23 17:52


Ursprung


Antworten:


Der Grund für das Kopieren von Array-Parametern besteht darin, zu vermeiden, dass jemand das Array ändert, nachdem Sie seine Elemente validiert haben. Dies ist eine sehr gute Verteidigungstechnik, die Sie vor bösartigen Anrufen bei einem Anrufer schützt.

In diesem Fall ist der Aufrufer jedoch JVM. Wenn Sie nicht davon ausgehen, dass JVM frei von schädlichem Code ist, haben Sie ein viel größeres Problem als etwas, das durch Kopieren eines Arrays gelöst werden könnte.

Die einzige Ausnahme ist, wenn du passierst args zu einigen Ihrer Funktionen. In diesem Fall ist das Erstellen einer Kopie eine sehr gute Idee, falls eine Methode sich dazu entschließt, den Inhalt der Datei zu ändern args. Das ist der einzige Fall, in dem ich eine Kopie empfehlen würde. Ob main ist der einzige Ort, an dem args wird verwendet, eine Kopie ist nicht notwendig.


6
2017-09-23 18:10



Ich kann mir einiges vorstellen, die zwei offensichtlichsten (für mich) sind:

  • Wenn Sie sie ändern, müssen Sie immer noch auf die ursprünglichen Werte zurückgreifen
  • Wenn du benutzt main als eine "normale" Methode, z. B. nicht nur von der Befehlszeile aus aufgerufen

Im Allgemeinen ist es in diesem Fall jedoch nicht sehr nützlich.


2
2017-09-23 17:57