2013-08-23 2 views
8

Sonar mi mostra un lavoro minore dicendo:Sonar: Array dovrebbe contenere finali virgola

- Array Trailing Comma 
Array should contain trailing comma. 

E il mio codice contiene:

RECOVER_PASSWORD(new String[] { 
     RequiredPermissions.USERS_PASSWORD_RECOVER, 
     RequiredPermissions.USER_RETRIEVE, 
     RequiredPermissions.API_USER_RETRIEVE, 
     RequiredPermissions.ONETIMELINK_CREATE, 
     RequiredPermissions.API_ONETIMELINK_CREATE, 
     RequiredPermissions.PASSWORD_RECOVER, 
     RequiredPermissions.API_PASSWORD_RECOVER }), 

Perché dovrei inserire una virgola finale?

risposta

15

Perché dovrei inserire una virgola finale?

Non è necessario. Sospetto che Sonar dovrebbe mostrare un avvertimento lì.

Dipende dalla preferenza del programmatore ciò che preferisce. L'aggiunta di una virgola finale alla fine dell'array semplifica la rimozione o l'aggiunta di una voce successiva dall'array.

Quindi, se si dispone di una matrice come:

String[] arr = new String[] { 
        "abc", 
        "def", 
        "ghi", 
       } 

Aggiunta di una voce semplicemente richiede di aggiungere che l'ingresso con trailing virgola alla fine della matrice. Senza virgola, devi prima aggiungere una virgola, quindi l'elemento.

E la rimozione di un elemento richiede solo di rimuovere quella linea contenente quell'elemento. O semplicemente commentando quella linea.

String[] arr = new String[] { 
        "abc", 
        "def", 
       // "ghi", // This won't cause any error 
       } 

Se trailing virgola non è stato consentito, quindi se si rimuove l'ultimo elemento, si dovrebbe andare a togliere la virgola prima troppo. Bene, so che questa ragione è abbastanza assurda. Ma è permesso.


Questo è molto utile per i generatori di codice durante la generazione del codice per l'inizializzazione dell'array. Possono semplicemente continuare ad aggiungere elementi con la virgola finale nella matrice, senza preoccuparsi se si tratta dell'ultimo elemento.

Facciamo un esempio:

StringBuilder array = new StringBuilder(); 

array.append("int[] arr = new int[] {").append("\n"); 
for (int i = 0; i < 10; ++i) { 
    array.append(i + ",").append("\n"); 
} 
array.append("}").append("\n"); 

considerare se una virgola finale non è stato permesso, allora come quel codice sarà simile. Dovresti gestire l'ultimo elemento separatamente. Quindi, sta solo facendo del bene ai generatori di codice.

+0

Nel mio scenario, Sonar Qube mostra "virgola finale" in Blocker e non come Avviso. –

5

JLS (§10.6) states:

Una virgola finale può apparire dopo l'ultima espressione in un inizializzatore matrice e viene ignorato.

Non è assolutamente necessario.

Tuttavia, è in qualche modo una scelta di stile e può semplificare il riordino, la manipolazione e/o il copia-incolla dell'ultimo elemento. Spostare RequiredPermissions.API_PASSWORD_RECOVER in un altro posto o incollare nelle nuove voci sottostanti può essere più semplice in quanto non è necessario aggiungere una virgola aggiuntiva e rischiare un errore di sintassi da errori di digitazione o errori di battitura.