Java-Enum枚举类实践

date
Jan 22, 2018
slug
Java-Enum枚举类实践
status
Published
tags
Java
summary
type
Post

应用场景

业务系统中的业务对象,一般都会涉及到业务状态,比如:草稿、待审核、发布。为了保证状态的统计管理和使用,我们一般都会先去定义好这些状态,业务逻辑中引用这些定义。 在这里,数据结构就值得我们斟酌一下。

解决方案

静态变量

有很多人可能会这么去写:
//状态(0-草稿,1-发布)
public static final int RELEASED_STATUS = 1;
public static final int DRAFT_STATUS  = 0;
组织结构上,可能是写在业务对象内或单独一个类或集中写在一个类。 这么写,基本能满足要求。但不是最好的:
  • 不够清晰,不易读懂,静态变量多了就需要你花费时间去分辨对应关系
  • 类型不安全,设置时,如果直接设置int值,编译过程中不会被检查出来
  • 如果你还需要解析对应有名称,如 0:"草稿",还需要额外编写方法,使代码更加难以维护

枚举(enum)

可以很完美地解决问题:
public enum MyStatus{
    DRAFT("待修订", 0), PENDING("待审核", 1), ACCEPTED("正常", 2);

    private String name;
    private int index;

    /**
     * 构造函数
     * @param name
     * @param index
     */
    MyStatus(String name, int index) {
        this.name = name;
        this.index = index;
    }
    /**
     * 取index
     * @return
     */
    public int getIndex() {
        return this.index;
    }

    /**
     * 取name
     * @return
     */
    public String getName() {
        return this.name;
    }
    /**
     * 获取包含所有成员的map
     */
    public static Map getAll() {
        HashMap<Integer, String> all = new HashMap<>();
        for (MyStatus i : MyStatus.values()) {
            all.put(i.index, i.name);
        }
        return all;
    }

    public static void main(String[] args){
        System.out.println(JSON.toJSONString(MyStatus.values()));
        System.out.println(JSON.toJSONString(MyStatus.getAll()));
    }
}
注:enum内部其实就是一个特别的类,你可以定义自己的各种方法去满足业务需求。

© XieZhichao 2022 - 2024