zoukankan      html  css  js  c++  java
  • Java基础教程:枚举类型

    Java基础教程:枚举类型

    枚举类型

      枚举是将一具有类似特性的值归纳在一起的方法。比如,我们可以将周一到周日设计为一个枚举类型、彩虹的七种颜色设计为一个枚举类型。

    常量实现枚举

      我们通过定义常量的方式来实现,如下:

    Public static class RainbowColor { 
        
       // 红橙黄绿青蓝紫七种颜色的常量定义
       public static final int RED = 0; 
       public static final int ORANGE = 1; 
       public static final int YELLOW = 2; 
       public static final int GREEN = 3; 
       public static final int CYAN = 4; 
       public static final int BLUE = 5; 
       public static final int PURPLE = 6; 
    }
    

      我们可以直接在程序中通过RainbowColor.XXXX来引用这些常量。

    常量实现的枚举存在问题

    • 类型无指意性:由于颜色枚举值仅仅是一些无任何含义的整数值,如果在运行期调试时候,你就会发现日志中有很多魔术数字,但除了程序员本身,其他人很难明白其奥秘。
    • 类型不安全:正是由于颜色值是整数类型,所有程序运行时可能传入非法参数。
    • 没有命名空间:由于颜色常量只是类的属性,当你使用时不得不通过类来访问。
    • 一旦枚举值修改后,所有引入该枚举值代码的地方都需要重新编译。‘

     

    ENUM关键字

      Java 5.0之后推出了enum关键字,在语言层面增加了枚举类型。现在我们再来定义彩虹颜色值的枚举类型

    enum RainbowColor {
        RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE
    }
    

      从上面的定义形式来看,似乎 Java 中的枚举类型很简单,但实际上 Java 语言规范赋予枚举类型的功能非常的强大,它不仅是简单地将整形数值转换成对象,而是将枚举类型定义转变成一个完整功能的类定义。这种类型定义的扩展允许开发者给枚举类型增加任何方法和属性,也可以实现任意的接口。另外,Java 平台也为 Enum 类型提供了高质量的实现,比如默认实现 Comparable 和 Serializable 接口,让开发者一般情况下不用关心这些细节。

    使用Switch语句

      枚举类型的一个作用是扩大了 switch 语句使用范围。5.0 之前,Java 中 switch 的值只能够是简单类型,比如 int、byte、short、char, 有了枚举类型之后,就可以使用对象了。这样一来,程序的控制选择就变得更加的方便

    // 定义一周七天的枚举类型         
    public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun } 
     
    // 读取当天的信息
    WeekDayEnum today = readToday(); 
     
    // 根据日期来选择进行活动
    switch(today) { 
     Mon: do something; break; 
     Tue: do something; break; 
     Wed: do something; break; 
     Thu: do something; break; 
     Fri: do something; break; 
     Sat: play sports game; break; 
     Sun: have a rest; break; 
    }

    定制Enum类型

      如果需要给枚举类型增加一些复杂功能,也可以通过类似 class 的定义来给枚举进行定制。比如要给 enum 类型增加属性,可以像下面这样定义:

    enum WeekDayEnum {
        Mon("EAT"),
        Tue("FLY"),
        Wed("SLEEP"),
        Thu("SWIM"),
        Fri("STUDY"),
        Sat("SIT"),
        Sun("SEE");
    
        //枚举对象私有属性
        private String thing;
    
        //枚举对象构造函数
        private WeekDayEnum(String thing) {
            this.thing = thing;
        }
    
        //枚举对象定制方法
        public String getThing() {
            return thing;
        }
    }
    

      不过有几个和类定义不同的地方需要注意:

    • 构造方法不能用public或protected
    • 最后一个枚举值与后续代码要用分号隔开

     

    Enum相关工具类

      JDK5.0 中在增加 Enum 类的同时,也增加了两个工具类 EnumSet 和 EnumMap,这两个类都放在 java.util 包中。这两者使用均和传统的Map、Set操作相同。

    获取子集

         EnumSet<WeekDayEnum> subset = EnumSet.of(WeekDayEnum.Mon, WeekDayEnum.Wed); 
         for (WeekDayEnum day : subset) { 
             System.out.println(day);  
         }

    Map

       // 定义一个 EnumMap 对象,映射表主键是日期枚举类型,值是颜色枚举类型
       private static Map<WeekDayEnum, RainbowColor> schema = 
               new EnumMap<WeekDayEnum, RainbowColor>(WeekDayEnum.class); 
       for (int i = 0; i < WeekDayEnum.values().length; i++) { 
           schema.put(WeekDayEnum.values()[i], RainbowColor.values()[i]); 
       } 
    

     

    参考链接

     

  • 相关阅读:
    我们都可以把它放 Sidecar 容器中,这样微服务具备了 Super power,一种超能力
    DP 状态 DP 转移方程 动态规划解题思路
    完全二叉树 原因 完全二叉树最后一层节点靠左的原因
    延时任务最佳实践方案总结
    b+ 树 只存储 索引
    埋点质量保障体系建设
    linux命令重定向>、>>、 1>、 2>、 1>>、 2>>、 <
    卡特兰数
    python 使用函数名的字符串调用函数(4种方法)_black-heart的专栏-CSDN博客 https://blog.csdn.net/mrqingyu/article/details/84403924
    12 | 服务注册与发现如何满足服务治理
  • 原文地址:https://www.cnblogs.com/MrSaver/p/11109511.html
Copyright © 2011-2022 走看看