netty系列之:我有一个可扩展的Enum你要不要看一下?
netty系列之:我有一個可擴展的Enum你要不要看一下?
簡介
很多人都用過java中的枚舉,枚舉是JAVA 1.5中引用的一個新的類型,用來表示可以列舉的范圍,但是可能很少有人知道java中的enum到底是怎么工作的,enum和Enum有什么關(guān)系 ?Enum可不可以擴展 ?
一起來看看吧。
enum和Enum
JAVA1.5中引入了枚舉類 ,我們通常使用enum關(guān)鍵字來定義一個枚舉類:
public enum StatusEnum { START(1,"start"), INPROCESS(2,"inprocess"), END(3,"end"); private int code; private String desc; StatusEnum(int code, String desc){ this.code=code; this.desc=desc; }}上面的枚舉類中,我們自定義了構(gòu)造函數(shù),并且定義了3個枚舉對象。
接下來看下怎么來使用這個枚舉類 :
public static void main(String[] args) { StatusEnum start = START; System.out.println(start.name()); System.out.println(start.ordinal()); System.out.println(start.code); System.out.println(start.desc); }可以輸出code和desc很好理解,因為這是我們自定義的枚舉類中的屬性,但是name和ordinal是什么呢 ?他們是哪里來的呢 ?
這里就要介紹java.lang.Enum類了,它是JAVA中所有enum枚舉類的父類,name()和ordinal()方法就是在這個類中定義的:
public final int ordinal() { return ordinal; }public final String name() { return name; }其中ordinal表示的是枚舉類中枚舉的位置,那么就是枚舉類中枚舉的名字 。在上面的例子中 ,START的兩個值分別是1和START。
我們來看下Enum類的定義:
public abstract class Enum>implements Comparable, Serializable 輸入它是一個抽象類,但是編譯器是不允許你繼承這個類的 。如果你強行繼承,則會拋錯:
Classes cannot directly extend 'java.lang.Enum'所以說,強扭的瓜不甜 ,大家一定要記住 。
事實上,不僅僅Enum類本身不能被繼承 ,上面創(chuàng)建的enum類StatusEnum也是不能被繼承的 。
這會造成一個什么問題呢?
如果這個enum是包含在一個外部jar包中的時候,你就沒法對該enum進行擴展,在某些特定的情況下 ,這樣的限制可能會帶來一些不便。
還好,netty也意識到了這個問題 ,接下來,我們看下netty是怎么解決的。
netty中可擴展的Enum:ConstantPool
netty中的表示常量的類叫做Constant ,它有兩個屬性