zoukankan      html  css  js  c++  java
  • java enum(枚举)的使用

      在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。

      例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。

      enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中,在上面的这种情况下,enum就能派上用场了。枚举类型的用途不仅如此,具体可用场景可看下面的介绍

    1、常量

      以前我们定义一个常量通常都是使用 public static final …… 定义的,如下面:

    public static final CONSTANT_STR = "TEST";

      或者使用接口定义的变量,因为接口定义的变量默认都是public static final,如下:

    /**
     * 星期的常量接口
     */
    public interface IWeekConstants {
        String MON = "Mon";
        String TUE = "Tue";
        String WED = "Wed";
        String THU = "Thu";
        String FRI = "Fri";
        String SAT = "Sat";
        String SUN = "Sun";
    }

      有了枚举我们可以使用下面的方式:

    public enum WeekEnum {
        MON, TUE, WED, THU, FRI, SAT, SUN;
    }

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

      上面那段代码声明的enum对象实际上调用了7次Enum(String name, int ordinal) 这个构造函数。(name 是常量,上面是MON,TUE等,ordinal是被创建顺序)

    new Enum<EnumTest>("MON",0);
    new Enum<EnumTest>("TUE",1);
    new Enum<EnumTest>("WED",2);
    。。。。。。

    2、switch

      当我们用switch时,一般都是使用int和char,但其实枚举也可以用在switch中,而且可能使用枚举,可以让我们的代码的可读性更强。下面是枚举使用enum的例子

    enum Color{  
        GREEN, YELLOW, RED  
    }  
    public class TrafficLight {  
        Color color = Color.RED;  
        public void change() {  
            switch (color) {  
            case RED:  
                System.out.println("红色");  
                break;  
            case YELLOW:  
                System.out.println("黄色");  
                break;  
            case GREEN:  
                System.out.println("绿色");  
                break;  
            }  
        }  
    }  

    3、向枚举中添加新方法 + 遍历

      我们使用常量的时候,我们使用接口的时候是可以有值与之对应的,如上面IWeekConstants 接口的MON的值是Mon,但枚举好像没能标示出这种意义。下面我们就讨论该方式的实现和枚举类型的遍历

      枚举类型提供了构造函数,我们可以通过构造函数和覆写toString方法来实现。实现代码如下:

    package com.zcr.test;
    
    enum ActionTypeEnum{
        //通过括号赋值,而且必须带有一个参构造器和一个属性跟方法,否则编译出错
        //赋值必须都赋值或都不赋值,不能一部分赋值一部分不赋值;如果不赋值则不能写构造器,赋值编译也出错
        下载(1,"xiazai"),访问(2,"fangwen");
        int index;
        String name;
        
        private ActionTypeEnum(int index,String name){
            this.index = index;
            this.name = name;
        }
    
        public int getIndex()
        {
            return index;
        }
    
        public void setIndex(int index)
        {
            this.index = index;
        }
    
        public String getName()
        {
            return name;
        }
    
        public void setName(String name)
        {
            this.name = name;
        }
        
        
    }
    
    public class EnumTest
    {
        public static void main(String[] args)
        {
            ActionTypeEnum[] actionTypeEnums = ActionTypeEnum.values();
            for(ActionTypeEnum actionTypeEnum : actionTypeEnums){
                System.out.println("name=" + actionTypeEnum.getName());
                System.out.println("index= " + actionTypeEnum.getIndex());
                System.out.println("oridary=" + actionTypeEnum.ordinal());
                System.out.println("this = " + actionTypeEnum);
                System.out.println("下载值:"  + actionTypeEnum.valueOf("下载"));
                System.out.println("name()方法= " + actionTypeEnum.name());
                System.out.println("--------------叫我分割线------------------");
            }
        }
    }

    运行结果:

    name=xiazai
    index= 1
    oridary=0
    this = 下载
    下载值:下载
    name()方法= 下载
    --------------叫我分割线------------------
    name=fangwen
    index= 2
    oridary=1
    this = 访问
    下载值:下载
    name()方法= 访问
    --------------叫我分割线------------------

    4、总结

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

      致谢:感谢您的阅读!

  • 相关阅读:
    Google Data Highlighter
    java里的单例实现
    zuul实现的限流
    vscode解决nuget插件不能使用的问题
    springboot~yml里的自定义配置~续
    Cocos2d—X游戏开发之CCToggle(菜单标签切换)CCControlSwitch(开关切换)
    Flash Builder 4的快捷方式和调试技巧
    无刷电机之无感方案控制难点解析
    UVa10815
    [置顶] 学生管理系统验收出现的问题及解决方法
  • 原文地址:https://www.cnblogs.com/0201zcr/p/5104497.html
Copyright © 2011-2022 走看看