2013-10-01 13 views
6

Kiedy kompiluję mój Dzień Enum w języku Java, generuje on plik Day.class i pliki klasy 8 Day $ #., Więc chcę wiedzieć, dlaczego kompilator generuje 8 $ #. Klasy zamiast 7, ponieważ mam 7 stałych enum , ale 8 nadpisuję adnotacje, zrozumiałem, że pliki Dollar.class są generowane dla każdej klasy wewnętrznej lub stałych enum, ale co z ośmioma plikami .class, dla których są generowane?

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(); 
} 

i generuje w ten sposób:

  • Day.class
  • dzień $ 1.class
  • dzień $ 2.class
  • dzień $ 3.class
  • dzień $ 4.class
  • Dzień 5 $ Klasa
  • Da y $ 6.class
  • Day $ 7.class
  • Day $ 8.class
+0

@SotiriosDelimanolis naprawdę nie, dżentelmen tutaj wie, jakie są klasy z dolara w nazwie, pyta o coś innego. –

+5

(Czy wiesz, że używasz ósemkowych stałych?) –

+0

grałem z kompilatorem i odjąłem przełącznik wewnątrz nadpisania toString i wygenerowałem 7 plików .class, więc założę, że osiem jest generowane przez enum przełącznik?? każdy wie, czy to jest odpowiedź? – Eefret

Odpowiedz

1

Każdemu dosłownemu enumowi generowana jest klasa określona przez nazwę Enum oraz indeks literału enum, wszystko to oprócz klasy generowanej przez Enum, klasa enum z sufiksem 8 jest mapą o nazwie SwitchMap, która jest mapa, która zachowuje odniesienie do literalnego indeksu enum używanego przez przełącznik, jeśli wyłączysz ten kod, możesz go zobaczyć.

 try{ 
      Class<?> c = Class.forName("com.kaissersoft.test.objective.one.three.enums.Days$8"); 

      Field[] fs= c.getDeclaredFields(); 
      for(Field f: fs){ 
      System.out.println(f.toString()); 
      } 
     }catch(ClassNotFoundException cne){ 
      cne.printStackTrace(); 
     } 


// Output 
static final int[] com.kaissersoft.test.objective.one.three.enums.Days$8.$Switch 
Map$com$kaissersoft$test$objective$one$three$enums$Days 
+0

Dość dobrze odebrane – Eefret

0

właśnie kopiować i skompilowany kod i wynik na moim komputerze jest następujący:

  • Day. Klasa
  • Day $ 1.class
  • dzień $ 2.class
  • Day $ 3.class
  • dzień $ 4.class
  • Day $ 5.class
  • dzień $ 6.class
  • Day $ 7.class

nr Day$8.class został utworzony. Może miałeś przed 8 klas wewnętrznych, skompilowałeś, a potem właśnie usunąłeś jeden ... Spróbuj otworzyć za pomocą edytora tekstu pliki .class, możesz zrozumieć coś więcej z czytelnych znaków ... Na przykład w moim Day$1.class Mogę przeczytać tekst "Dzisiaj jest niedziela".

+1

Może to być zależne od kompilatora. –