2011-01-15 7 views
13

Sto scrivendo un codice che improvvisamente vede che "," non causa alcun errore di compilazione. Perché ?perché la virgola (,) non causa errori di compilazione?

Quello che voglio dire

public enum A { 
    B, C, ; // no compilation error 
} 

ma

int a, b, ; // compilation error 
+5

collegamento? solo una semplice risposta qual è la ragione della tua aggressività? –

+4

Questa è una domanda interessante, non ho mai saputo che una virgola extra in enum sia accettabile – Reza

+0

La sintassi Java è basata sulla famiglia di linguaggi C e, per quanto ne so, è così che viene eseguita in C, per gli array comunque. –

risposta

16

http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.9

L'Enumbody ha le seguenti specifiche:

{ [EnumConstantList] [,] [EnumBodyDeclarations] } 

Come potete vedere non ci può essere una virgola opzionale dopo l'EnumConstantList, questa è solo una convenienza di notazione.

+1

l'unico inconveniente possibile è una revisione del codice a cui il revisore non piace, perché "non viene utilizzato né in JDK né nel resto del nostro codice" – Vlasec

14

Il linguaggio è stato progettato in questo modo in modo che sia facile aggiungere e riordinare gli elementi - in particolare se ognuno è su una riga da solo.

Il confronto con dichiara variabili non è buona, ma array consentono una più valori nello stesso modo:

int[] foo = { 1, 2, 3, }; 

Fondamentalmente, aggiungendo valori extra a una raccolta definita nel codice sorgente è piuttosto più comune di voler aggiungere una variabile a una dichiarazione.

0

I principali vantaggi sono che rende più facili da modificare gli elenchi di più righe e riduce il disordine nelle differenze.

Cambio:

public enum Names{ 
    'manny', 
    'mo', 
    'jack', 
} 

a:

public enum Names{ 
    'Manny' 
    'mo', 
    'jack', 
    'roger', 
} 

comporta solo un cambiamento di una sola riga nella diff:

public enum Names{ 
     'manny', 
     'mo', 
     'jack', 
+  'roger', 
    } 

Questo batte la più confusa diff multi-linea quando la virgola finale è stata omessa:

public enum Names { 
     'manny', 
     'mo', 
-  'jack' 
+  'jack', 
+  'roger' 
    } 

Quest'ultima diff rende più difficile vedere che è stata aggiunta una sola riga e che l'altra linea non ha modificato il contenuto.

Sulla base di una risposta di Raymond: https://stackoverflow.com/a/11597911/5111897

+0

È necessario aver reso almeno il codice compilabile. I valori citati non sono identificativi enum validi. Inoltre hai dimenticato la virgola dopo 'Manny'. –