一文搞定java枚舉

java枚舉

EnumSet

​ EnumSet是一個專門針對枚舉類型的Set接口的實現類,由於其內部實現是位向量,所以其能高效的處理枚舉類型數據

​ 但是由於EnumSet是一個抽象類,所以創建EunmSet時不能使用new關鍵字,不過EnumSet提供了很多有用的靜態工廠方法

方法

方法 描述
allOf(Class< E> elementType) 創建一個包含指定元素類型的所有元素的枚舉set
clone() 返回一個set集合
complementOf(EnumSet s) 創建一個其元素類型與指定枚舉set相同的set集合(新集合中包含原集合所不包含的枚舉成員)
copyOf(EnumSet s) 創建一個其元素類型與指定枚舉 set 相同的枚舉 set集合(新集合中包含與原集合相同的枚舉成員)
copyOf(Collection s) 創建一個從指定 collection 初始化的枚舉 set
noneOf(Class elementType) 創建一個具有指定元素類型的空枚舉 set
range(E from, E to) 創建一個最初包含由兩個指定端點所定義範圍內的所有元素的枚舉 set。
of 創建一個最初包含指定元素的枚舉 set。注意:可以指定多個元素,所以在這裏我沒有列舉參數

實例

public class Player {
    public enum PlayerType{
        TENNIS,
        FOOTBALL,
        BASKETBALL
    }

    public static void main(String[] args) {
        EnumSet<PlayerType> playerTypeEnum = EnumSet.noneOf(PlayerType.class);
        System.out.println(playerTypeEnum);
        EnumSet<PlayerType> enumSet = EnumSet.allOf(PlayerType.class);
        System.out.println(enumSet);
    }
}

​ 使用noneOf()創建了一個空的PlayerTypr的EnumSet;使用allOf()創建了一個包含所有PlayerType的EnumSet

​ 有了EnumSet後,我們就可以使用Set的一些方法了

EnumMap

​ EnumMap是一個專門針對枚舉類型的Map接口的實現類,它可以將枚舉常量作爲鍵來使用,其效率比HashMap更高,可以直接通過數組下標(枚舉的ordinal值)訪問到元素

​ 和EnumSet不同的是,EnumMap不是一個抽象類,其可用使用new關鍵詞

單例

​ 通常情況下,實現一個單例模式不是很簡單:具體見博文:什麼你還不會單例模式?看我花式實現餓漢式和懶漢式

public class Singleton {  
    private volatile static Singleton singleton; 
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {
        synchronized (Singleton.class) { 
        if (singleton == null) {  
            singleton = new Singleton(); 
        }  
        }  
    }  
    return singleton;  
    }  
}

​ 但是使用枚舉值可以讓代碼大量精簡

public enum EasySingleton{
    INSTANCE;
}

​ 枚舉默認實現了Serializable接口,因此虛擬機可以保證該類爲單例。在傳統方式中我們必須確保單例在反序列化期間不能創建任何新實例

枚舉可與數據庫交互

​ 我們可以配合Mybatis將數據庫字段轉化爲枚舉類型,假設現在數據庫字段中有如下一個字段

`check_type` int(1) DEFAULT NULL COMMENT '工作狀態(1:在職、0:離職)',

​ 它對應的枚舉類型爲CheckType,代碼如下:

public enum CheckType {
        NO_PASS(0, "離職"), PASS(1, "在職");
        private int key;

        private String text;

        private CheckType(int key, String text) {
            this.key = key;
            this.text = text;
        }

        public int getKey() {
            return key;
        }

        public String getText() {
            return text;
        }

        private static HashMap<Integer,CheckType> map = new HashMap<Integer,CheckType>();
        static {
            for(CheckType d : CheckType.values()){
                map.put(d.key, d);
            }
        }

        public static CheckType parse(Integer index) {
            if(map.containsKey(index)){
                return map.get(index);
            }
            return null;
        }
    }
  • CheckType添加了構造方法們還有兩個字段,key爲int型,text爲String型

  • CheckType中有一個public static CheckType parse(Integer index)方法,可將一個 Integer 通過 key 的匹配轉化爲枚舉類型。

    ​ 現在只需要在Mybatis的配置文件中使用typeHandler將數據庫字段轉化爲枚舉類型

<resultMap id="CheckLog" type="com.entity.CheckLog">
  <id property="id" column="id"/>
  <result property="checkType" column="check_type" typeHandler="com.CheckTypeHandler"></result>
</resultMap>

​ 其中checkType字段對應的類如下

public class CheckLog implements Serializable {

    private String id;
    private CheckType checkType;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public CheckType getCheckType() {
        return checkType;
    }

    public void setCheckType(CheckType checkType) {
        this.checkType = checkType;
    }
}

​ CheckTypeHandler 轉換器的類源碼如下:

public class CheckTypeHandler extends BaseTypeHandler<CheckType> {

    @Override
    public CheckType getNullableResult(ResultSet rs, String index) throws SQLException {
        return CheckType.parse(rs.getInt(index));
    }

    @Override
    public CheckType getNullableResult(ResultSet rs, int index) throws SQLException {
        return CheckType.parse(rs.getInt(index));
    }

    @Override
    public CheckType getNullableResult(CallableStatement cs, int index) throws SQLException {
        return CheckType.parse(cs.getInt(index));
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int index, CheckType val, JdbcType arg3) throws SQLException {
        ps.setInt(index, val.getKey());
    }
}

​ CheckTypeHandler的核心功能就是調用CheckType枚舉類的parse()方法對數據庫字段進行轉換

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章