今天在看lucene源代码是看到其中的Store、Index等几个枚举类型里面不仅定义了方法,而其实例中也定义了方法,晚上回来又学习了一下Enum,整理写了这个博客。
第一个代码片段:
class="java" name="code">package com.lfl.em;
public enum Coin {
penny("10p"), dollor("20$"), rmb("30¥");
private String value;
public String getValue() {
return value;
}
Coin(String value) {
this.value = value;
}
public static void main(String[] args) {
Coin coin = Coin.dollor;
System.out.println(coin.getValue());
System.out.println(coin.getDeclaringClass());
}
}
?coin.getDeclaringClass() 输出 com.lfl.em.Coin
?
第二个代码片段:
package com.lfl.em;
public interface ISeason {
public String mySeason();
}
?
package com.lfl.em;
public class SeasonImpl implements ISeason {
public enum Season implements ISeason {
SPRING {
@Override
public String yourSeason() {
return null;
}
},
SUMMER {
public String mySeason() {
return "夏季";
}
@Override
public String yourSeason() {
return null;
}
},
AUTUMN {
public String mySeason() {
return "秋季";
}
@Override
public String yourSeason() {
return null;
}
},
WINTER {
public String mySeason() {
return "冬季";
}
@Override
public String yourSeason() {
return null;
}
};
public String mySeason() {
return "未知季节";
}
public static String mySeason(Season season) {
if (Season.SPRING == season) {
return "春季";
} else if (Season.SUMMER == season) {
return "夏季";
} else if (Season.AUTUMN == season) {
return "秋季";
} else if (Season.WINTER == season) {
return "冬季";
}
return "未知季节";
}
public abstract String yourSeason();
}
@Override
public String mySeason() {
return "我和季节枚举没有关系啊!";
}
public static void main(String[] args) {
Season a = Season.AUTUMN;
String a1 = a.mySeason();
String a2 = Season.mySeason(a);
System.out.println(a1 + " == " + a2);
Season s = Season.SPRING;
String s1 = s.mySeason();
String s2 = Season.mySeason(s);
System.out.println(s1 + " != " + s2);
}
}
?
两个输出分别为:
?秋季 == 秋季
?未知季节 != 春季
?
枚举可以通过implements实现某个接口,但不能通过extends继承某个类或枚举。
abstract不可以修饰枚举,因为枚举中定义的各个值其实是枚举的实例。
?
从以上两个例子可以看出 不仅枚举类型里可以定义方法,而其实例中也可以定义方法。
而枚举和枚举实例又有很“微妙”的关系,从第二个例子中可以看出枚举实例和枚举好像有继承关系,枚举实例必须实现枚举里的抽象方法;枚举或枚举实例必须实现枚举实现接口中的方法,在这个例子中是mySeason()方法。在eclipse提示中可以看到说枚举是枚举实例的supertype。
?
这种关系可能是在编译期通过编译器确立的,
对枚举的理解还不是很透彻,以上分析如果有不正确或不恰当的欢迎指正出来共同学习。
?