Eef*_*ret 7 java enums overriding class inner-classes
当我编译我的java Enum Day时,它会生成他的Day.class文件和8天$#.class Files,所以我想知道为什么编译器生成8 $#.class而不是7,因为我有7个枚举常量,但是8覆盖注释,我已经知道Dollar.class文件是为每个内部类或枚举常量生成的,但是八个.class文件为它生成了什么呢?
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();
}
Run Code Online (Sandbox Code Playgroud)
它产生了这个:
每个 Enum 字面量都会生成一个由 Enum 名称加上枚举字面量索引标识的类,除了 Enum 生成的类之外,后缀为 8 的枚举类是一个名为 SwitchMap 的映射,它是一个维护开关使用的枚举文字索引的引用,如果执行此代码,您可以看到它。
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3739 次 |
| 最近记录: |