学习Java——枚举

2023-05-16

目录

 

枚举的用法

定义

特点

应用场景 

总结

用法

        ①、常量

        ②、switch

        ③、向枚举中添加新方法

        ④、覆盖枚举的方法

        ⑤、实现接口

        ⑥、使用接口组织枚举

每日寄语


枚举的用法

        在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用public final static 方法定义的代码如下,分别用1 表示春天,2表示夏天,3表示秋天,4表示冬天。

public class Season {
    public static final int SPRING = 1;
    public static final int SUMMER = 2;
    public static final int AUTUMN = 3;
    public static final int WINTER = 4;
}

        这种方法称作int枚举模式。可这种模式有什么问题呢,我们都用了那么久了,应该没问题的。通常我们写出来的代码都会考虑它的安全性易用性可读性。 首先我们来考虑一下它的类型安全性。当然这种模式不是类型安全的。比如说我们设计一个函数,要求传入春夏秋冬的某个值。但是使用int类型,我们无法保证传入的值为合法。代码如下所示:

private String getChineseSeason(int season){
        StringBuffer result = new StringBuffer();
        switch(season){
            case Season.SPRING :
                result.append("春天");
                break;
            case Season.SUMMER :
                result.append("夏天");
                break;
            case Season.AUTUMN :
                result.append("秋天");
                break;
            case Season.WINTER :
                result.append("冬天");
                break;
            default :
                result.append("地球没有的季节");
                break;
        }
        return result.toString();
    }

    public void doSomething(){
        System.out.println(this.getChineseSeason(Season.SPRING));//这是正常的场景

        System.out.println(this.getChineseSeason(5));//这个却是不正常的场景,这就导致了类型不安全问题
    }

        程序getChineseSeason(Season.SPRING)是我们预期的使用方法。可getChineseSeason(5)显然就不是了,而且编译会通过,在运行时会出现什么情况,我们就不得而知了。这显然就不符合Java程序的类型安全。

        接下来我们来考虑一下这种模式的可读性。使用枚举的大多数场合,我都需要方便得到枚举类型的字符串表达式。如果将int枚举常量打印出来,我们所见到的就是一组数字,这没什么太大的用处。我们可能会想到使用String常量代替int常量。虽然它为这些常量提供了可打印的字符串,但是它会导致性能问题,因为它依赖于字符串的比较操作,所以这种模式也是我们不期望的。 从类型安全性程序可读性两方面考虑,intString枚举模式的缺点就显露出来了。幸运的是,从Java1.5发行版本开始,就提出了另一种可以替代的解决方案,可以避免intString枚举模式的缺点,并提供了许多额外的好处。那就是枚举类型(enum type)。

定义

        枚举类型(enum type是指由一组固定的常量组成合法的类型Java中由关键字enum来定义一个枚举类型。下面就是java枚举类型的定义。

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER;
}

特点

        java定义枚举类型的语句很简约。它有以下特点:

  1. 使用关键字enum 
  2. 类型名称,比如这里的Season 
  3. 一串允许的值,比如上面定义的春夏秋冬四季
  4. 枚举可以单独定义在一个文件中,也可以嵌在其它Java类中。
  5. 枚举可以实现一个或多个接口(Interface)
  6. 可以定义新的变量
  7. 可以定义新的方法
  8. 可以定义根据具体枚举值而相异的类

应用场景 

以在背景中提到的类型安全为例,用枚举类型重写那段代码。代码如下:

public enum Season {
    SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);

    private int code;
    private Season(int code){
        this.code = code;
    }

    public int getCode(){
        return code;
    }
}
public class UseSeason {
    /**
     * 将英文的季节转换成中文季节
     * @param season
     * @return
     */
    public String getChineseSeason(Season season){
        StringBuffer result = new StringBuffer();
        switch(season){
            case SPRING :
                result.append("[中文:春天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
                break;
            case AUTUMN :
                result.append("[中文:秋天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
                break;
            case SUMMER : 
                result.append("[中文:夏天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
                break;
            case WINTER :
                result.append("[中文:冬天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
                break;
            default :
                result.append("地球没有的季节 " + season.name());
                break;
        }
        return result.toString();
    }

    public void doSomething(){
        for(Season s : Season.values()){
            System.out.println(getChineseSeason(s));//这是正常的场景
        }
        //System.out.println(getChineseSeason(5));
        //此处已经是编译不通过了,这就保证了类型安全
    }

    public static void main(String[] arg){
        UseSeason useSeason = new UseSeason();
        useSeason.doSomething();
    }
}

        [中文:春天,枚举常量:SPRING,数据:1] [中文:夏天,枚举常量:SUMMER,数据:2] [中文:秋天,枚举常量:AUTUMN,数据:3] [中文:冬天,枚举常量:WINTER,数据:4]

        这里有一个问题,为什么我要将域添加到枚举类型中呢?目的是想将数据与它的常量关联起来。如1代表春天,2代表夏天。

总结

        那么什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数、一年四季等。或者是在我们编译前就知道其包含的所有值的集合。Java 1.5的枚举能满足绝大部分程序员的要求的,它的简明,易用的特点是很突出的。

用法

        ①、常量

public enum Color {  
  RED, GREEN, BLANK, YELLOW  
}  

        ②、switch

enum Signal {  
    GREEN, YELLOW, RED  
}  
public class TrafficLight {  
    Signal color = Signal.RED;  
    public void change() {  
        switch (color) {  
        case RED:  
            color = Signal.GREEN;  
            break;  
        case YELLOW:  
            color = Signal.RED;  
            break;  
        case GREEN:  
            color = Signal.YELLOW;  
            break;  
        }  
    }  
}  

        ③、向枚举中添加新方法

public enum Color {  
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
    // 成员变量  
    private String name;  
    private int index;  
    // 构造方法  
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
    // 普通方法  
    public static String getName(int index) {  
        for (Color c : Color.values()) {  
            if (c.getIndex() == index) {  
                return c.name;  
            }  
        }  
        return null;  
    }  
    // get set 方法  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getIndex() {  
        return index;  
    }  
    public void setIndex(int index) {  
        this.index = index;  
    }  
}  

        ④、覆盖枚举的方法

public enum Color {  
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
    // 成员变量  
    private String name;  
    private int index;  
    // 构造方法  
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
    //覆盖方法  
    @Override  
    public String toString() {  
        return this.index+"_"+this.name;  
    }  
}  

        ⑤、实现接口

public interface Behaviour {  
    void print();  
    String getInfo();  
}  
public enum Color implements Behaviour{  
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
    // 成员变量  
    private String name;  
    private int index;  
    // 构造方法  
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
//接口方法  
    @Override  
    public String getInfo() {  
        return this.name;  
    }  
    //接口方法  
    @Override  
    public void print() {  
        System.out.println(this.index+":"+this.name);  
    }  
}  

        ⑥、使用接口组织枚举

public interface Food {  
    enum Coffee implements Food{  
        BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
    }  
    enum Dessert implements Food{  
        FRUIT, CAKE, GELATO  
    }  
}

 枚举的实现

        Java SE5提供了一种新的类型-Java的枚举类型,关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。

        要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字,他并不是一个类,那么枚举是由什么类维护的呢,我们简单的写一个枚举:

public enum t {
    SPRING,SUMMER;
}

然后我们使用反编译,看看这段代码到底是怎么实现的,反编译后代码内容如下: 

public final class T extends Enum
{
    private T(String s, int i)
    {
        super(s, i);
    }
    public static T[] values()
    {
        T at[];
        int i;
        T at1[];
        System.arraycopy(at = ENUM$VALUES, 0, at1 = new T[i = at.length], 0, i);
        return at1;
    }

    public static T valueOf(String s)
    {
        return (T)Enum.valueOf(demo/T, s);
    }

    public static final T SPRING;
    public static final T SUMMER;
    private static final T ENUM$VALUES[];
    static
    {
        SPRING = new T("SPRING", 0);
        SUMMER = new T("SUMMER", 1);
        ENUM$VALUES = (new T[] {
            SPRING, SUMMER
        });
    }
}

        通过反编译代码我们可以看到,public final class T extends Enum,说明,该类是继承了Enum类的,同时final关键字告诉我们,这个类也是不能被继承的。

        当我们使用enmu来定义一个枚举类型的时候,编译器会自动帮我们创建一个final类型的类继承Enum类,所以枚举类型不能被继承。


每日寄语

         把时间分给睡眠,分给书籍,分给运动,分给花鸟树木,还有山川湖水,而不是浪费在无用的人和事上,当你开始做时间的主人,哪些烦恼与不安也就自然烟消云散了  ——网友热评

        

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习Java——枚举 的相关文章

随机推荐

  • Ubuntu操作系统下Pixhawk原生固件PX4的编译方法

    在Ubuntu上搭建环境相对简单许多 xff0c 按照PX4中文维基官网的教程即可 工具链安装 权限设置 把用户添加到用户组 dialout xff08 如果这步没做 xff0c 会导致很多用户权限问题 xff09 span class h
  • Tegra TK1中文输入法出错解决

    输入 xff1a ibus daemon drx
  • ubuntu16.0.4查看内存实时动态

    1 命令行输入 xff1a top 2 安装命令如下 xff1a sudo apt get install htop 安装完后 xff0c 直接输入命令 xff1a htop
  • xsense免注册资料网址

    http www avicom cn
  • loam中imu消除重力加速度的数学推导

    最近在看loam的源码发现里面有一段关于imu消除重力加速度的源码 xff0c 刚开始看不明白后来终于搞清楚了 xff0c 欢迎大家批评指正 要理解这个问题首先得明白欧拉角到旋转矩阵的变换 先上图 此图描述的是先绕X xff0c 再绕Y x
  • rc=20 > Connect to SAP gateway failed

    这种错误 xff0c 我是在一台用户的电脑上碰到的 xff0c 解决方案很简单 xff1a 把Computer Name换成英文 汗了许久
  • 循环结构

    循环结构 while循环 while是最基本的循环 xff0c 它的结构为 xff1a 只要布尔表达式为true xff0c 循环就会一直执行下去 我们大多数情况是会让循环停止下来的 xff0c 我们需要一个让表达式失效的方式来结束循环 少
  • 社会闲散人士或者普通大学生想走嵌入式方向该怎么学比较有效

    社会闲散人士或者普通大学生想走嵌入式方向该怎么学比较有效 先说观点 1这几年嵌入式开发的薪水已经非常高了 我们实验室做嵌入式的学长 xff0c 年薪平均30w以上 2嵌入式开发的竞争力很小 相比算法等 3嵌入式开发薪水的高低与学校的好坏挂钩
  • 单片机最小系统着实让人着迷

    单片机最小系统着实让人着迷 插播一条 xff1a 我自己在今年年初录制了一套还比较系统的入门单片机教程 xff0c 想要的同学找我拿就行了免費的 xff0c 私信我就可以哦 点我头像黑色字体加我地球呺也能领取哦 最近比较闲 xff0c 带做
  • 听我一句劝,单片机不要去学STM32真的

    听我一句劝 xff0c 单片机不要去学STM32真的 插播一条 xff1a 我自己在今年年初录制了一套还比较系统的入门单片机教程 xff0c 想要的同学找我拿就行了免費的 xff0c 私信我就可以哦 点我头像黑色字体加我地球呺也能领取哦 最
  • uboot启动内核是什么,认识 uboot 和 内核 之间不可不说的关系

    uboot启动内核是什么 xff0c 认识 amp nbsp uboot和内核之间不可不说的关系 uboot镜像为 amp nbsp uboot bin xff0c Linux镜像为 amp nbsp zImage 嵌入式设备中的分区表是自
  • C语言中最难啃的硬骨头非这三个莫属

    C语言中最难啃的硬骨头非这三个莫属 插播一条 xff1a 我自己在今年年初录制了一套还比较系统的入门单片机教程 xff0c 想要的同学找我拿就行了免費的 xff08 禾 厶 亻 言 手 戈 xff09 最近比较闲 xff0c 带做毕设 xf
  • 解析图腾柱无桥PFC的状态控制(基于DSP C2000)

    解析图腾柱无桥PFC的状态控制 xff08 基于DSP C2000 xff09 插播一条 xff1a 自己在今年整理一套单片机单片机相关论文800余篇 论文制作思维导图 原理图 43 源代码 43 开题报告 43 正文 43 外文资料 想要
  • 手把手教您怎么编写第一个单片机程序

    手把手教您怎么编写第一个单片机程序 插播一条 xff1a 文章末尾有惊喜哟 51单片机的开发环境是Keil软件 Keil软件虽然是一个收费软件 xff0c 但从uVision2到目前的uVison4版本都有破解版 xff0c 在网上都能够找
  • 硬件工程师的真实前途我说出来可能你们不信

    自己做了5年硬件工程师 xff0c 对于行业如何不多做评价 xff0c 不同人不同经历 xff0c 就有不同的看法 我仅对自己的职业发展进行一下回顾和反思 xff0c 算是给过去的自己做个小总结 xff0c 写下来也方便后续再翻回来看看自己
  • 大一C语言入门到底怎么学

    大一C语言入门到底怎么学 大一C语言入门按照下面路线来 xff0c 以及把下面的100道C语言编程案例学会就入门啦 xff5e 入门篇 1 什么是计算机语言 2 C语言的程序的结构 3 运行C语言的步骤与方法 4 了解简单的算法 5 怎么表
  • BW性能监控利器——ST13总结

    题记 xff1a BW 的小工具 xff0c ST13 xff0c 近来每每使用 xff0c 都颇有感慨 xff0c 故总结如下 xff0c 以备后用 1 Process Chain xff1a ST13 gt BW TOOLS gt Pr
  • 你见过的最差的程序员是怎样的?

    你见过的最差的程序员是怎样的 xff1f 公司来了个应届生 xff0c 让我来带 得 我成了保姆 xff0c 百度一下就能找到答案的事 xff0c 非得让我手把手的教 终于有一天 xff0c 我忍不住了 xff0c 说了他一顿 xff0c
  • 大龄程序员都去哪了?

    大龄程序员都去哪了 xff1f 大龄程序员依然在各个大中小公司正常工作 外资 国企不说了 xff0c 30 40岁的员工很多很多 xff0c 不仅仅是程序员 xff0c 产品啊 xff0c 测试 xff0c 运维 不仅仅喝计算机有关系的 x
  • 学习Java——枚举

    目录 枚举的用法 定义 特点 应用场景 总结 用法 常量 switch 向枚举中添加新方法 覆盖枚举的方法 实现接口 使用接口组织枚举 每日寄语 枚举的用法 在 span style background color d7d8d9 java