2011-01-15 6 views
13

Ich schreibe einen Code, der plötzlich sieht, dass "," keinen Kompilierungsfehler verursacht. Warum ?Warum verursacht Komma (,) keinen Kompilierungsfehler?

Was ich meine

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

aber

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

link? nur eine einfache Antwort. Was ist der Grund für deine Aggression? –

+4

Dies ist eine interessante Frage, ich wusste nie, dass ein zusätzliches Komma in enum akzeptabel ist – Reza

+0

Java-Syntax basiert auf der C-Familie von Sprachen, und so weit ich weiß, ist es in C getan, für Arrays sowieso. –

Antwort

16

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

Die Enumbody hat die folgende Spezifikation:

{ [EnumConstantList] [,] [EnumBodyDeclarations] } 

Wie man dort sehen kann, kann ein optionales Komma nach dem EnumConstantList sein, dies ist nur ein Notations Komfort.

+1

die einzige mögliche Unannehmlichkeit ist ein Code-Review, wo der Prüfer es nicht mag, weil "es weder in JDK noch im Rest unseres Codes verwendet wird" – Vlasec

14

Die Sprache auf diese Weise wurde so konzipiert, dass es einfach ist, Elemente hinzufügen und neu anordnen - insbesondere dann, wenn jeder auf einer Linie auf seinem eigenen ist.

Der Vergleich mit Variablen erklärt nicht gut ist, aber Arrays für mehr Werte in der gleichen Art und Weise erlauben:

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

Grundsätzlich eine Sammlung auf zusätzliche Werte addiert im Quellcode definiert ist eher üblich, als eine Variable zu einer Deklarationsanweisung hinzufügen zu wollen.

0

Die Hauptvorteile sind, dass es mehrzeilige Listen einfacher zu bearbeiten und Unordnung in Diffs reduziert.

Wechsel:

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

zu:

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

handelt sich nur um eine einzeilige Änderung des diff:

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

Dies schlägt das verwirrender mehrzeiligen diff wenn das nachfolgende Komma wurde weggelassen:

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

Das letztere Diff macht es schwieriger zu sehen, dass nur eine Zeile hinzugefügt wurde und dass die andere Zeile den Inhalt nicht änderte.

Basierend auf Antwort von Raymond: https://stackoverflow.com/a/11597911/5111897

+0

Sie sollten mindestens den Code kompilierbar gemacht haben. Angegebene Werte sind keine gültigen Enum-Bezeichner. Außerdem hast du das Komma nach "Manny" vergessen. –