java中枚举类使用

 enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

主要包括如下内容:

1.定义常量

2. 语法定义

3.遍历、switch等常用操作

4. enum对象的常用方法使用

5. 给 enum 自定义属性和方法

6. EnumSet,EnumMap 的应用

7. enum 的原理分析

 

定义常量

包括对常量的代码以及定量的描述:多用于错误码的使用。

/**提示码*/

public enum MsgConstant {

    //-----------------------成功提示信息----------------------------------
    
    /** 新增成功 **/
    ADD_SUCCESS("0", "新增成功"),
    /** 修改成功 **/
    UPDATE_SUCCESS("0", "修改成功"),
        //-----------------------失败提示信息----------------------------------
    
    /** 新增失败 **/
    ADD_FAILURE("15001", "新增失败"),
    /** 修改失败 **/
    UPDATE_FAILURE("15002", "修改失败");

    private String code;
    private String msg;
    
    private MsgConstant(String code, String msg) {
        this.msg = msg;
        this.code = code;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

}

/**枚举类定义常量*/

public class EnumConstant {

    /**
     * 删除标识: 0.正常 1.删除 2.审核
     *
     */
    public enum DELETE_FLAG {
        DELETE_FLAG_NO("0", "正常"), 
        DELETE_FLAG_YES("1", "删除"), 
        DELETE_FLAG_AUDIT("2", "审核");
        
        private String code;
        private String name;
        
        private DELETE_FLAG(String code, String name) {
            this.code = code;
            this.name = name;
        }
        
        public static String getName(String code) {
            for (DELETE_FLAG t : DELETE_FLAG.values()) {
                if (t.getCode().equals(code)) {
                    return t.name;
                }
            }
            return null;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }    
    
    /**
     * 商家状态: 0.未生效 1.已生效 2.已停用 3.已失效
     *
     */
    public enum BUSINESS_STATUS {
        STATUS_NOT_EFFECT("0", "未生效"), 
        STATUS_EFFECT("1", "已生效"), 
        STATUS_STOP("2", "已停用"), 
        STATUS_DISABLED("3", "已失效");
        
        private String code;
        private String name;
        
        private BUSINESS_STATUS(String code, String name) {
            this.code = code;
            this.name = name;
        }
        
        public static String getName(String code) {
            for (BUSINESS_STATUS t : BUSINESS_STATUS.values()) {
                if (t.getCode().equals(code)) {
                    return t.name;
                }
            }
            return null;
        }
        
        public String getCode() {
            return code;
        }
        
        public void setCode(String code) {
            this.code = code;
        }
        
        public String getName() {
            return name;
        }
        
        public void setName(String name) {
            this.name = name;
        }
    }    
    
    /**
     * 商家是否启用: 0.否 1.是
     *
     */
    public enum BUSINESS_ENABLE {
        ENABLE_NO("0", "否"), 
        ENABLE_YES("1", "是");
        
        private String code;
        private String name;
        
        private BUSINESS_ENABLE(String code, String name) {
            this.code = code;
            this.name = name;
        }
        
        public static String getName(String code) {
            for (BUSINESS_ENABLE t : BUSINESS_ENABLE.values()) {
                if (t.getCode().equals(code)) {
                    return t.name;
                }
            }
            return null;
        }
        
        public String getCode() {
            return code;
        }
        
        public void setCode(String code) {
            this.code = code;
        }
        
        public String getName() {
            return name;
        }
        
        public void setName(String name) {
            this.name = name;
        }
    }    
    
    /**
     * 商家是否限制用户数: 0.不限 1.限制
     *
     */
    public enum BUSINESS_LIMIT_USER {
        LIMIT_USER_NO("0", "不限"), 
        LIMIT_USER_YES("1", "限制");
        
        private String code;
        private String name;
        
        private BUSINESS_LIMIT_USER(String code, String name) {
            this.code = code;
            this.name = name;
        }
        
        public static String getName(String code) {
            for (BUSINESS_LIMIT_USER t : BUSINESS_LIMIT_USER.values()) {
                if (t.getCode().equals(code)) {
                    return t.name;
                }
            }
            return null;
        }
        
        public String getCode() {
            return code;
        }
        
        public void setCode(String code) {
            this.code = code;
        }
        
        public String getName() {
            return name;
        }
        
        public void setName(String name) {
            this.name = name;
        }
    }    
    
    /**
     * 商家是否设置功能菜单: 0.否 1.是
     *
     */
    public enum BUSINESS_SET_MENU {
        SET_MENU_NO("0", "否"), 
        SET_MENU_YES("1", "是");
        
        private String code;
        private String name;
        
        private BUSINESS_SET_MENU(String code, String name) {
            this.code = code;
            this.name = name;
        }
        
        public static String getName(String code) {
            for (BUSINESS_SET_MENU t : BUSINESS_SET_MENU.values()) {
                if (t.getCode().equals(code)) {
                    return t.name;
                }
            }
            return null;
        }
        
        public String getCode() {
            return code;
        }
        
        public void setCode(String code) {
            this.code = code;
        }
        
        public String getName() {
            return name;
        }
        
        public void setName(String name) {
            this.name = name;
        }
    }
    
    /**
     * 用户是否启用: 0.是 1.否
     *
     */
    public enum USER_ENABLE {
        ENABLE_YES("0", "是"), 
        ENABLE_NO("1", "否");
        
        private String code;
        private String name;
        
        private USER_ENABLE(String code, String name) {
            this.code = code;
            this.name = name;
        }
        
        public static String getName(String code) {
            for (USER_ENABLE t : USER_ENABLE.values()) {
                if (t.getCode().equals(code)) {
                    return t.name;
                }
            }
            return null;
        }
        
        public String getCode() {
            return code;
        }
        
        public void setCode(String code) {
            this.code = code;
        }
        
        public String getName() {
            return name;
        }
        
        public void setName(String name) {
            this.name = name;
        }
    }    
    
}
 

/**使用*/

EnumConstant.USER_ENABLE.getName(newUserEntity.getIsActive());

EnumConstant.USER_ENABLE.ENABLE_YES.getName();

 

语法(定义)

    创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

 

/*测试*/

public enum EnumTest {

    MON, TUE, WED, THU, FRI, SAT, SUN;

}

这段代码实际上调用了7次 Enum(String name, int ordinal):

new Enum<EnumTest>("MON",0);

new Enum<EnumTest>("TUE",1);

new Enum<EnumTest>("WED",2);

...

遍历、switch 等常用操作

对enum进行遍历和switch的操作示例代码:

public class Test {

    public static void main(String[] args) {

        for (EnumTest e : EnumTest.values()) {

            System.out.println(e.toString());

        }

         

        System.out.println("----------------我是分隔线------------------");

         

        EnumTest test = EnumTest.TUE;

        switch (test) {

        case MON:

            System.out.println("今天是星期一");

            break;

        case TUE:

            System.out.println("今天是星期二");

            break;

        // ... ...

        default:

            System.out.println(test);

            break;

        }

    }

}

输出结果:

MON

TUE

WED

THU

FRI

SAT

SUN

----------------我是分隔线------------------

今天是星期二

enum 对象的常用方法介绍

int compareTo(E o) 
          比较此枚举与指定对象的顺序。

Class<E> getDeclaringClass() 
          返回与此枚举常量的枚举类型相对应的 Class 对象。

String name() 
          返回此枚举常量的名称,在其枚举声明中对其进行声明。

int ordinal() 
          返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

String toString()

           返回枚举常量的名称,它包含在声明中。

static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 
          返回带指定名称的指定枚举类型的枚举常量。

public class Test {

    public static void main(String[] args) {

        EnumTest test = EnumTest.TUE;

         

        //compareTo(E o)

        switch (test.compareTo(EnumTest.MON)) {

        case -1:

            System.out.println("TUE 在 MON 之前");

            break;

        case 1:

            System.out.println("TUE 在 MON 之后");

            break;

        default:

            System.out.println("TUE 与 MON 在同一位置");

            break;

        }

         

        //getDeclaringClass()

        System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());

         

        //name() 和  toString()

        System.out.println("name(): " + test.name());

        System.out.println("toString(): " + test.toString());

         

        //ordinal(), 返回值是从 0 开始

        System.out.println("ordinal(): " + test.ordinal());

    }

}

 

输出结果:

TUE 在 MON 之后

getDeclaringClass(): com.hmw.test.EnumTest

name(): TUE

toString(): TUE

ordinal(): 1

给 enum 自定义属性和方法

给 enum 对象加一下 value 的属性和 getValue() 的方法:

public enum EnumTest {

    MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) {

        @Override

        public boolean isRest() {

            return true;

        }

    },

    SUN(0) {

        @Override

        public boolean isRest() {

            return true;

        }

    };

 

    private int value;

 

    private EnumTest(int value) {

        this.value = value;

    }

 

    public int getValue() {

        return value;

    }

 

    public boolean isRest() {

        return false;

    }

}

public class Test {

    public static void main(String[] args) {

        System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue());

    }

}

输出结果:

EnumTest.FRI 的 value = 5

 

EnumTest.FRI 的 value = 5

EnumSet,EnumMap 的应用

public class Test {

    public static void main(String[] args) {

        // EnumSet的使用

        EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);

        for (EnumTest day : weekSet) {

            System.out.println(day);

        }

 

        // EnumMap的使用

        EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);

        weekMap.put(EnumTest.MON, "星期一");

        weekMap.put(EnumTest.TUE, "星期二");

        // ... ...

        for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {

            Entry<EnumTest, String> entry = iter.next();

            System.out.println(entry.getKey().name() + ":" + entry.getValue());

        }

    }

}

 

原理分析

        enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:

public class com.hmw.test.EnumTest extends java.lang.Enum{

    public static final com.hmw.test.EnumTest MON;

    public static final com.hmw.test.EnumTest TUE;

    public static final com.hmw.test.EnumTest WED;

    public static final com.hmw.test.EnumTest THU;

    public static final com.hmw.test.EnumTest FRI;

    public static final com.hmw.test.EnumTest SAT;

    public static final com.hmw.test.EnumTest SUN;

    static {};

    public int getValue();

    public boolean isRest();

    public static com.hmw.test.EnumTest[] values();

    public static com.hmw.test.EnumTest valueOf(java.lang.String);

    com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);

}

所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。

总结

    可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值