2014-11-19 6 views
33

Questa è una delle regole da analizzatore statico Googles CodePro Analytix:Gli array non devono essere inizializzati staticamente da un inizializzatore di array. Perché?

Sommario

array non devono essere inizializzate staticamente da un inizializzatore matrice.

Descrizione

Questa revisione controlli regola per le variabili di matrice che vengono inizializzate (sia nel inizializzatore o in un'istruzione di assegnazione) utilizzando un inizializzatore matrice.

Esempio

La seguente dichiarazione di matrice sarebbe contrassegnato a causa dell'uso di un inizializzatore array:

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

Ora, posso disattivarlo se non mi piace, non è un problema. Ma mi chiedo perché questo dovrebbe essere un problema e quale sarebbe la soluzione per impedire che il codice venga contrassegnato dalla regola di controllo?

+6

Sembra solo che ci sia un gruppo di regole predefinite che sono solo una questione di gusti in modo da poterlo configurare facilmente. Osservando [questo elenco] (https://developers.google.com/java-dev-tools/codepro/doc/features/audit/audit_rules_com.instantiations.assist.eclipse.auditGroup.codingStyle) trovo molte regole che Mi sembra infondato o persino discutibile. – Holger

+0

questo ha senso –

+0

Il verificatore verifica se l'array è const? Forse non vogliono valori che possono essere modificati in seguito andando in qualcosa di diverso dalla memoria dinamica dell'heap, a causa del potenziale di sovraccarico del buffer, che porta a falle nella sicurezza. – Marty

risposta

16

È una domanda interessante, e questa decisione è infondata IMHO. (Spero che qualcun altro risponda a questo thread se c'è una ragione legittima dietro questa decisione progettuale).

Inoltre, Google mostra come formattare quei inizializzatori statici nella loro buona pratica formattazione guida https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.8.3.1-array-initializers senza dire nulla su quanto male è quello di utilizzare questi costrutti ...

Credo che la persona dietro questa regola appena avuto un dente contro quello stile di programmazione :)

+3

Non nego, l'ho postato come risposta in quanto è più leggibile di un commento. Inoltre, immagino che si possa solo speculare su questo, poiché non ho trovato alcuna fonte che spieghi il perché di quella decisione. –

+1

Penso che in qualche modo risponda alla domanda "Ma mi chiedo perché questo sarebbe un problema, e quale sarebbe la migliore pratica raccomandata?". È consentito secondo lo styleguide di google. – Magnilex

+1

La parte rilevante è che "Google mostra come formattare quegli inizializzatori statici nella loro guida di formattazione delle buone pratiche" anche se il loro analizzatore li esclude. Il collegamento è solo un riferimento che non è necessario per comprendere il mio punto. –

11

Penso che sia perché si tratta di una sintassi speciale che funziona solo durante l'inizializzazione di values.

int[] values = {1,2,3} //legal 

int[] values2; 
values2 = {1,2,3} //not legal 


int [] values3; 
values3 = new int[]{1,2,3} //legal 

L'ultima forma values3 è legale wether è quando si crea l'array o successivamente. Quindi, invece di mescolare forme di array di inizializzazione, sarebbe meglio usare sempre lo stesso modulo. IMHO che rende il codice più chiaro, seguendo il principio della sorpresa minima.

Stranamente il google code style does non proibisce questa forma di inizializzazione che è molto chiara in questo example.

+1

"Array Initializer" è effettivamente utilizzato dal [JLS] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6) specificamente per la parte '{values}', tuttavia 'new int [] {1,2,3}' usa ancora un inizializzatore di matrice ["come parte di un'espressione di creazione di array"] (https://docs.oracle.com /javase/specs/jls/se7/html/jls-15.html#jls-15.10). La domanda è, l'analizzatore intende la stessa cosa? – zapl

+0

Una domanda correlata: http://stackoverflow.com/questions/5387643/array-initialization-syntax-when-not-in-a-declaration –