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]); 
       } 
    

     

    参考链接

     

  • 相关阅读:
    10 个深恶痛绝的 Java 异常。。
    为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
    推荐一款代码神器,代码量至少省一半!
    Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。
    hdu 3853 LOOPS(概率 dp 期望)
    hdu 5245 Joyful(期望的计算,好题)
    hdu 4336 Card Collector(期望 dp 状态压缩)
    hdu 4405 Aeroplane chess(概率+dp)
    hdu 5036 Explosion(概率期望+bitset)
    hdu 5033 Building (单调栈 或 暴力枚举 )
  • 原文地址:https://www.cnblogs.com/MrSaver/p/11109511.html
Copyright © 2011-2022 走看看