2013-10-01 6 views
6

Wenn ich meinen Java Enum Day kompiliere, erzeugt er seine Day.class Datei und 8 Day $ #. Class Dateien, also möchte ich wissen, warum der Compiler 8 $ #. Class statt 7 generiert, weil ich 7 enum Konstanten habe , aber 8 Override-Annotationen, ich habe verstanden, dass die Dollar.class-Dateien für jede innere Klasse oder durch Enum-Konstanten erzeugt werden, aber was ist mit der acht .class-Datei, wofür sie generiert wird?

package com.kaissersoft.test.objective.one.three.enums; 

public enum Day{ 
    SUNDAY(01){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Sunday"); 
    } 
}, 
MONDAY(02){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Monday"); 
    } 
}, 
TUESDAY(03){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Tuesday"); 
    } 
}, 
WEDNESDAY(04){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Wednesday"); 
    } 
}, 
THURSDAY(05){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Thursday"); 
    } 
}, 
FRIDAY(06){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Friday"); 
    } 
}, 
SATURDAY(07){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Saturday"); 
    } 
}; 

int dayNumber; 
Day(final int day){ 
    dayNumber = day; 
} 

public int getDayNumber(){ 
    return dayNumber; 
} 

@Override 
public String toString(){ 

    switch(this){ 
     case SUNDAY: 
      System.out.println("Sunday("+this.getDayNumber()+")"); 
      break; 
     case MONDAY: 
      System.out.println("Monday("+this.getDayNumber()+")"); 
      break; 
     case TUESDAY: 
      System.out.println("Tuesday"+this.getDayNumber()+")"); 
      break; 
     case WEDNESDAY: 
      System.out.println("Wednesday("+this.getDayNumber()+")"); 
      break; 
     case THURSDAY: 
      System.out.println("Thursday("+this.getDayNumber()+")"); 
      break; 
     case FRIDAY: 
      System.out.println("Friday("+this.getDayNumber()+")"); 
      break; 
     case SATURDAY: 
      System.out.println("Saturday("+this.getDayNumber()+")"); 
      break; 
    } 
    return super.toString(); 
} 

//Abstract method to the day Salute 
public abstract void salute(); 
} 

Und es erzeugt diese:

  • Day.class
  • Tag $ 1.class
  • Tag $ 2.Klasse
  • Tag $ 3.class
  • Tag $ 4.class
  • Tag $ 5.Klasse
  • Da y 6.class $
  • Tag $ 7.class
  • Tag $ 8.class
+0

@SotiriosDelimanolis ist nicht wirklich, Herr hier weiß, was die Klassen mit einem Dollarzeichen im Namen sind, er fragt nach etwas anderem. –

+5

(Sie wissen, dass Sie dort oktale Konstanten verwenden?) –

+0

Ich spielte mit dem Compiler und ich habe den Schalter innerhalb der toString override subtrahiert und es generiert 7 .class-Dateien, so dass ich die acht eins wird von der enum generiert Schalter?? weiß jemand, ob das die Antwort ist? – Eefret

Antwort

1

von jedem Enum wörtlichen eine Klasse mit dem Namen des Enum und dem Index des Enum wörtlichen, alles außer der Enum generierten Klasse identifiziert erzeugt wird, ist die Enum-Klasse mit dem Suffix 8 eine Karte SwitchMap Wich genannt ist Eine Map, die einen Verweis auf enum literal index enthält, die vom Switch verwendet wird. Wenn Sie diesen Code ausführen, können Sie ihn sehen.

+0

Ziemlich gut beantwortet – Eefret

0

ich nur kopiert haben und den Code und das Ergebnis auf meinem Rechner zusammengestellt ist folgende:

  • Tag. Klasse
  • Tag $ 1.class
  • Tag 2.Klasse $
  • Tag $ 3.class
  • Tag $ 4.class
  • Tag 5.class $
  • Tag $ 6.class
  • Tag $ 7.class

Kein Day$8.class erstellt wurde. Vielleicht hast du vorher 8 innere Klassen kompiliert und dann hast du einfach eine entfernt ... Versuche mit einem Texteditor die .class Dateien zu öffnen, du könntest etwas mehr von den lesbaren Zeichen verstehen ... Zum Beispiel in meiner Day$1.class Ich kann den Text lesen "Heute ist Sonntag".

+1

Es könnte Compiler abhängig sein. –