2014-09-23 14 views
10

Qualcuno può immaginare quando questo codice:dovrebbe il metodo MAIN copiare gli argomenti di input?

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

dovrebbe diventare questa:

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

(Nella nostra società abbiamo una regola Sonar che forze come di coping o argomenti per tutti i metodi.) Posso immaginare perché può essere importante per i metodi standard, ma non trovo alcun vantaggio di averlo fatto all'inizio del metodo principale degli strumenti. Mi sto perdendo qualcosa?

+5

Ovviamente è necessario utilizzare le lingue in cui è impossibile modificare lo stato dei chiamanti. Detto questo, è scarso che lo strumento non riconosca se l'argomento è effettivamente mutato. – Ingo

+0

alcune discussioni sono qui: http://stackoverflow.com/questions/11580948/sonar-violation-security-array-is-stored-directly –

+1

Non sono un appassionato di questa regola del sonar. Inoltre, considero questa regola una cattiva idea. Cosa succede se voglio memorizzare un grande byte di dati binari [] nei miei oggetti? A mio avviso, copiare solo dopo essere stato costruito da un flusso è inutile. –

risposta

6

Il motivo per cui si copiano i parametri dell'array è di evitare la possibilità che qualcuno modifichi l'array dopo aver convalidato i suoi elementi. Questa è una tecnica difensiva molto buona, che ti protegge dalle chiamate dannose in un chiamante.

Tuttavia, in questo caso il chiamante è JVM stesso. Se non ti fidi di JVM per essere privo di codice dannoso, hai un problema molto più grande di qualcosa che potrebbe essere risolto copiando un array.

L'unica eccezione è quando si passa args ad alcune delle proprie funzioni. In questo caso, fare una copia è un'ottima idea, nel caso in cui alcuni metodi decidano di modificare il contenuto di args. Questo è l'unico caso in cui consiglierei di fare una copia. Se main è l'unico posto in cui viene utilizzato args, non è necessario eseguire una copia.

2

Posso immaginare un bel po ', i due più ovvia (per me) sono:

  • Se li si modifica, ma ancora bisogno di fare riferimento ai valori originali
  • Se si utilizza main come " normale "metodo, ad esempio, non solo chiamato dalla riga di comando

In generale, tuttavia, non è super-utile in questo caso.

Problemi correlati