今天在看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。
?
这种关系可能是在编译期通过编译器确立的,
对枚举的理解还不是很透彻,以上分析如果有不正确或不恰当的欢迎指正出来共同学习。
?