一文搞定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()方法对数据库字段进行转换

猜你喜欢

转载自blog.csdn.net/issunmingzhi/article/details/106664234