前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >枚举的几种使用案例(简单,进阶,switch,单例)

枚举的几种使用案例(简单,进阶,switch,单例)

作者头像
洋仔聊编程
发布2019-01-15 17:18:09
6540
发布2019-01-15 17:18:09
举报

首先,应该注意:

1>.枚举类型都隐式继承了java.lang.Enum类,因此不能继承其他类,但可以实现接口;

2>.枚举类型只能有私有的构造方法(java运行时创建,外部不能进行实例化);

3>不能泛型化;

4>当有字段和方法时,枚举常量的列表必须以分号结尾;

5>编译器在创建枚举时会自动添加一些特殊方法。例如,它们具有一个静态values方法和valueOf(String)方法

例子一(反编译(反汇编).class文件判断):

写一个java类名为:enumTest.java

enum Day{

        DAY,MOUTH,YEAR

}

public class enumTest {

        public static void main(String[] args) {

                Day day = Day.DAY;

        }

}

1.javac编译:javac enumTest.java

产生两个.class 文件:Day.class  enumTest.class

2.反编译Day.class ,发现原本写在enumTest.java文件中的enum类型的Day,被编译为了一个继承了Enum类的final类,里面的关键字也被编译为了static final类型的变量。还包含values()与valueOf(String)方法。

反汇编Day.class为字节码

3.反编译enumTest.class   在该类中enum Day已经不再该类中,被单独编译一个类

反汇编enumTest.class 为字节码

例子二(实际使用):

package cn.yoylee.test;

import java.util.Arrays;

/*简单使用*/

//public enum Day{

        // DAY,MOUTH,YEAR;

//}

/*进阶使用1*/

//enum Day{

//      DAY("天"),MOUTH("月"),YEAR("年"); //以分号结束(因为后面跟有方法)

//

//      private String value;

//

//      Day(String str){

//          this.value = str;

//      }

//

//      public String getValue(){

//         return value;

//      }

//}

/*进阶使用2*/

enum Day{

    DAY{

            public String getInfo(){

            return "天";

            }

};

    /**

    * 定义抽象方法

    * @return

    */

    public abstract String getInfo();

}

public class enumTest {

    public static void main(String[] args) {

        /*简单使用测试 */

        // Day day = Day.DAY;

        // //测试Enum的values()方法

        // System.out.println(Arrays.toString(Day.values()));

        /*进阶使用测试1*/

        // for (Day day : Day.values()){

        // System.out.println("参数名称:"+day.name()+" 参数值:"+day.getValue());

        // }

        /*进阶使用2*/

        System.out.println(Day.DAY.getInfo());

       }

}

package cn.yoylee.test;

public enum EnumTest3 {

        SYSTEM_NORMAL(200, "系统正常"),

        //异常 返回码范围 400 -419 业务无关异常

        INVALID_PARAM(401,"无效参数"),

        //服务端异常

        SERVICE_ERROR(500, "服务异常");

        private int code;

        private String desc;

        EnumTest3(int code, String desc) {

            this.code = code;

            this.desc = desc;

        }

        public int getCode() {

                return code;

        }

        public void setCode(int code) {

                this.code = code;

        }

        public String getDesc() {

                return desc;

        }

        public void setDesc(String desc) {

            this.desc = desc;

        }

        public static void main(String[] args) {

            for (EnumTest3 para : EnumTest3.values()){

                System.out.println("错误代码为:"+para.getCode()+" 错误信息:"+para.getDesc());

            }

        }

/**

* 输出:

* 错误代码为:200 错误信息:系统正常

错误代码为:401 错误信息:无效参数

错误代码为:500 错误信息:服务异常

*/

}

例子三(enum与switch):

enum Color {GREEN,RED,BLUE}

public class EnumTest2 {

    public static void printName(Color color){

        switch (color){

            case BLUE: //无需使用Color进行引用

                System.out.println("蓝色");

                break;

            case RED:

                System.out.println("红色");

                break;

            case GREEN:

                System.out.println("绿色");

                break;

        }

    }

    public static void main(String[] args){

        printName(Color.BLUE);

        printName(Color.RED);

        printName(Color.GREEN);

        /*输出*/

        //蓝色

        //红色

        //绿色

    }

}

例子四(enum与单例模式):

1.利用enum实现的单例模式类:EnumTest4_Signal

package cn.yoylee.test;

public enum EnumTest4_Signal {

        //自定义一个枚举的元素,代表EnumTest4_Signal类的实例

INSTANCE;

        //单例可以有自己的操作

        public void otherMethods(){

            //功能处理

        }

}

2.测试enum实现的单例模式的类:EnumTest4_use

package cn.yoylee.test;

/**

* 测试enum实现的单例模式

*/

public class EnumTest4_use {

    public static void main(String[] args) {

        //用enum实现的单利模式类:EnumTest4_Signal

        EnumTest4_Signal instance = EnumTest4_Signal.INSTANCE;

        EnumTest4_Signal instance1 = EnumTest4_Signal.INSTANCE;

        System.out.println("instance对象的hash值为:"+instance.hashCode());

        System.out.println("instance1对象的hash值为:"+instance1.hashCode());

        System.out.println("是否为同一个对象:"+(instance.hashCode()==instance1.hashCode()));

        //非单例模式的类:EnumTest2

        EnumTest2 enumTest = new EnumTest2();

        EnumTest2 enumTest1 = new EnumTest2();

        System.out.println("enumTest对象的hash值为:"+enumTest.hashCode());

        System.out.println("enumTest1对象的hash值为:"+enumTest1.hashCode());

        System.out.println("是否为同一个对象:"+(enumTest.hashCode()==enumTest1.hashCode()));

        /**

        * 输出:

        *      instance对象的hash值为:1163157884

                instance1对象的hash值为:1163157884

               是否为同一个对象:true

               enumTest对象的hash值为:1956725890

               enumTest1对象的hash值为:356573597

               是否为同一个对象:false

        */

    }

}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年07月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档