乱人伦 国语对白海角社区,五月激情丁香婷婷综合中文字幕,欧美伊人婷婷久久五月综合,亚洲精品无amm毛片,亚洲男人第一无码AV网站,国产日韩欧美丝袜一区二区,亚洲一区精品在线观看

netty系列之:我有一个可扩展的Enum你要不要看一下?-FG电子狂欢

netty系列之:我有一个可扩展的Enum你要不要看一下?

2026-01-17 04:09:31投稿人:熱博體育賬號(hào)(信陽)有限公司圍觀85663 評(píng)論

netty系列之 :我有一個(gè)可擴(kuò)展的Enum你要不要看一下?

簡(jiǎn)介

很多人都用過java中的枚舉 ,枚舉是JAVA 1.5中引用的一個(gè)新的類型,用來表示可以列舉的范圍,但是可能很少有人知道java中的enum到底是怎么工作的,enum和Enum有什么關(guān)系?Enum可不可以擴(kuò)展?

一起來看看吧。

enum和Enum

JAVA1.5中引入了枚舉類,我們通常使用enum關(guān)鍵字來定義一個(gè)枚舉類 :

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個(gè)枚舉對(duì)象。

接下來看下怎么來使用這個(gè)枚舉類:

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很好理解 ,因?yàn)檫@是我們自定義的枚舉類中的屬性,但是name和ordinal是什么呢 ?他們是哪里來的呢 ?

這里就要介紹java.lang.Enum類了 ,它是JAVA中所有enum枚舉類的父類,name()和ordinal()方法就是在這個(gè)類中定義的 :

public final int ordinal() {         return ordinal;    }public final String name() {         return name;    }

其中ordinal表示的是枚舉類中枚舉的位置,那么就是枚舉類中枚舉的名字 。在上面的例子中 ,START的兩個(gè)值分別是1和START 。

我們來看下Enum類的定義 :

public abstract class Enum>implements Comparable, Serializable

輸入它是一個(gè)抽象類 ,但是編譯器是不允許你繼承這個(gè)類的 。如果你強(qiáng)行繼承 ,則會(huì)拋錯(cuò):

Classes cannot directly extend 'java.lang.Enum'

所以說 ,強(qiáng)扭的瓜不甜,大家一定要記住 。

事實(shí)上 ,不僅僅Enum類本身不能被繼承,上面創(chuàng)建的enum類StatusEnum也是不能被繼承的 。

這會(huì)造成一個(gè)什么問題呢?

如果這個(gè)enum是包含在一個(gè)外部jar包中的時(shí)候,你就沒法對(duì)該enum進(jìn)行擴(kuò)展,在某些特定的情況下  ,這樣的限制可能會(huì)帶來一些不便  。

還好,netty也意識(shí)到了這個(gè)問題 ,接下來 ,我們看下netty是怎么解決的 。

netty中可擴(kuò)展的Enum:ConstantPool

netty中的表示常量的類叫做Constant,它有兩個(gè)屬性,分別是ID和name:

public interface Constant>extends Comparable{     int id();    String name();}

存儲(chǔ)這些Constant的就叫做ConstantPool 。ConstantPool中有一個(gè)ConcurrentMap用來保存具體的Constant。 我們看一下ConstantPool
的工廠類方法valueOf :

public T valueOf(String name) {         return getOrCreate(checkNonEmpty(name, "name"));    }

valueOf方法傳入創(chuàng)建的Constant的名字 。然后調(diào)用getOrCreate方法來創(chuàng)建新的Constant:

private T getOrCreate(String name) {         T constant = constants.get(name);        if (constant == null) {             final T tempConstant = newConstant(nextId(), name);            constant = constants.putIfAbsent(name, tempConstant);            if (constant == null) {                 return tempConstant;            }        }        return constant;    }

可以看到getOrCreate就是向constants Map中創(chuàng)建和獲取新創(chuàng)建的constant對(duì)象。

使用ConstantPool

ConstantPool是一個(gè)抽象類,如果我們需要新建一個(gè)枚舉類池,可以直接繼承ConstantPool,然后實(shí)現(xiàn)其中的newConstant方法  。下面是一個(gè)使用的具體例子 :

public final class Foo extends AbstractConstant{   Foo(int id, String name) {     super(id, name);  }}public final class MyConstants {   private static final ConstantPoolpool = new ConstantPool() {     @Override    protected Foo newConstant(int id, String name) {       return new Foo(id, name);    }  };  public static Foo valueOf(String name) {     return pool.valueOf(name);  }  public static final Foo A = valueOf("A");  public static final Foo B = valueOf("B");}private final class YourConstants {   public static final Foo C = MyConstants.valueOf("C");  public static final Foo D = MyConstants.valueOf("D");}

在上面的例子中,我們創(chuàng)建的枚舉類繼承自AbstractConstant,然后自定義了ConstantPool ,從pool中可以返回新創(chuàng)建的Foo對(duì)象 。

實(shí)時(shí)上 ,在netty channel中經(jīng)常使用的ChannelOption就是AbstractConstant的子類 ,我們簡(jiǎn)單來看下其中的實(shí)現(xiàn)