• Java 枚举类 详解


    1、枚举是什么?

      Java中的枚举其实是一种语法糖,在 JDK 1.5之后出现,用来表示固定且有限个的对象。比如一个季节类有春、夏、秋、冬四个对象;一个星期有星期一到星期日七个对象。这些明显都是固定的,且有限个。

    2、枚举类和普通类的区别

      ①、使用 enum 定义的枚举类默认继承 java.lang.Enum 类,即枚举类是不能再继承别的类了。而普通类的一般父类默认是 Object

      ②、枚举类的构造器只能使用 private 定义,而普通类的还可以用 public 修饰

      ③、枚举类的所有实例必须在枚举类中显示列出(,分隔   ;结尾),列出的实例系统会默认自动添加 public static final 修饰

      ④、所有的枚举类都提供了一个 values() 方法,可以用来遍历枚举值

    3、怎么用枚举?

       首先我们看,以一个季节类有春、夏、秋、冬四个对象为例:在 JDK 1.5以前是怎么表示的呢?

       创建一个 季节类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class Season {
        //属性不能修改,用 final 修饰
        private final String name;
        private final String desc;
         
        //因为枚举类的对象是有限的,即我们不能再外面 new Season(),所以构造器私有化
        private Season(String name,String desc) {
            this.name = name;
            this.desc = desc;
        }
         
        //不能再外面new Season(),那么内部必须创建出对象
        //外界直接通过类名来访问,用 static 修饰
        //外界不能修改,用 final 修饰
        public static final Season SPRING = new Season("春天""春暖花开");
        public static final Season SUMMER = new Season("夏天""炎炎盛夏");
        public static final Season FALL = new Season("秋天""秋高气爽");
        public static final Season WINTER = new Season("冬天""大雪纷飞");
     
        @Override
        public String toString() {
            return "Season [name=" + name + ", desc=" + desc + "]";
        }
         
         
    }

      测试:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class SeasonTest {
        public static void main(String[] args) {
            System.out.println(Season.SPRING);
            System.out.println(Season.SUMMER);
            System.out.println(Season.FALL);
            System.out.println(Season.WINTER);
        }
     
    }

      结果为:

    1
    2
    3
    4
    Season [name=春天, desc=春暖花开]
    Season [name=夏天, desc=炎炎盛夏]
    Season [name=秋天, desc=秋高气爽]
    Season [name=冬天, desc=大雪纷飞]

      

    使用 Enum 来表示季节类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public enum SeasonEnum {
     
        //必须在第一行写出有哪些枚举值
        SPRING("春天""春暖花开"),
        SUMMER("夏天""炎炎盛夏"),
        FALL("秋天""秋高气爽"),
        WINTER("冬天""大雪纷飞");
         
        private final String name;
        private final String desc;
         
        private SeasonEnum(String name, String desc) {
            this.name = name;
            this.desc = desc;
        }
         
         
    }

      测试:

    1
    2
    3
    4
    5
    6
    7
    8
    public static void main(String[] args) {
             
            System.out.println(SeasonEnum.SPRING); //SPRING
            //用 values() 来获取所有的枚举值
            for(SeasonEnum s : SeasonEnum.values()){
                System.out.println(s);
            }
        }

      

    枚举类还能实现接口:

    第一步:定义一个接口,方法是返回季节的月份

    1
    2
    3
    4
    5
    public interface SeasonEnumImpl {
        //用来返回季节的月份
        String getMonth();
     
    }

    第二步:季节类实现接口,并实现接口中的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public enum SeasonEnum implements SeasonEnumImpl{
     
        //必须在第一行写出有哪些枚举值
        SPRING("春天""春暖花开"){
            @Override
            public String getMonth() {
                return "12-2";
            }
        },
        SUMMER("夏天""炎炎盛夏"){
            @Override
            public String getMonth() {
                return "3-5";
            }
        },
        FALL("秋天""秋高气爽"){
            @Override
            public String getMonth() {
                return "6-8";
            }
        },
        WINTER("冬天""大雪纷飞"){
            @Override
            public String getMonth() {
                return "9-11";
            }
        };
         
        private final String name;
        private final String desc;
         
        private SeasonEnum(String name, String desc) {
            this.name = name;
            this.desc = desc;
        }
    }  

    测试:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static void main(String[] args) {
             
            System.out.println(SeasonEnum.SPRING); //SPRING
             
            //用 values() 来获取所有的枚举值
            for(SeasonEnum s : SeasonEnum.values()){
                System.out.println(s.getMonth());
            }
        } 

    结果为:

    1
    2
    3
    4
    5
    SPRING
    12-2
    3-5
    6-8
    9-11

      

      

    注意:

    ①、枚举类可以作为 switch--case 的表达式(JDK 1.5以后)

    ②、如果枚举类的对象只有一个,那么可以作为单例模式的实现

    作者:YSOcean
  • 相关阅读:
    【C++ OpenGL ES 2.0编程笔记】8: 使用VBO和IBO绘制立方体 【转】
    顶点缓存对象(VBO)【转】
    CompileGLShader
    VR虚拟现实的工作原理,你知道多少?【转】
    VR/AR工作原理、目前存在的技术问题
    Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
    nginx配置用户认证
    恢复阿里云RDS云数据库MySQL的备份文件到自建数据库
    阿里云rds linux平台使用wget 工具下载备份与日志文件
    screen 命令使用及示例
  • 原文地址:https://www.cnblogs.com/wangchaonan/p/10712069.html
Copyright © 2020-2023  润新知