枚举

简介:

                                                                                       

                        关于枚举-----jdk1.5的新特性之一

一.为什么要有枚举

      在软件开发中关于定义变量星期天(int weekDay)的值时,刚开始我规定 int weekDay = 7;但是时间长了,对int weekDay = 7的规定会忘却,到下一次要定义变量int weekDay = ?时,我可能会定义成0,那会和以前定义的不一致而出问题。(在多人开发中也会出现这样的问题,有人会定义成0,也有人会定义成7),使用枚举就可以避免上述情况的发生。

二.枚举的定义

     定义:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.(比如星期,就只有星期一-星期天,用枚举合适),枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName()和WeekDay.class.getName。

                  枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

示例:我有一个枚举 WeekDay

public enum WeekDay{
        SUN,MON

}


  FRI我在枚举里面没有定义,所以编译报错。

三.枚举的好处

     防止程序出错,统一变量取值,避免在开发时对一些固定变量取值前后不一的情况。

四.枚举的示例

       1.用普通类来模拟枚举的实现原理

/**
 * 用普通类实现枚举原理
 * @author JSON
 *
 */
public class WeekDay {
    /**
     * 私有构造函数方法,为了防止WeekDay被随便的实例化
     */
    private WeekDay(){}
    
    //定义静态常量星期一
    public final static WeekDay MON = new WeekDay();
    //定义静态常量星期二
    public final static WeekDay TUE = new WeekDay();
    //定义静态常量星期天
    public final static WeekDay SUN = new WeekDay();
    //下面省略了星期三,四,五,六

    //...

    /**
     * 获得下一天
     * @return
     */
    public WeekDay nextDay(){
        if(this==MON){
            return TUE;
        }else if(this==TUE){
            return SUN;
        }else{
            return MON;
        }
    }
    //打印名字的方法
    public String toString(){
        //当只有2个元素的时候可以只有写,但是有三个元素就不能这样写了。
        //return this == SUN?"SUN":"MON";//三元运算符
        if(this==SUN){
            return "SUN";
        }else if(this==TUE){
            return "TUE";
        }else{
            return "MON";
        }
    }
}

//main函数是程序入口,可以在类里面的任何地方,但是必须在一个类中

//public static void main(String[] args) {}-----------1

//public class Student {
//    public static void main(String[] args) {}---------2
//}

//public static void main(String[] args) {}-----------3

//1,3错的位置,2是对的位置

public static void main(String[] args){
        //星期一的对象
        WeekDay mon = WeekDay.MON;
        System.out.println(mon.toString());
        System.out.println(mon.nextDay().toString());
        System.out.println(mon.nextDay().nextDay().toString());

}

输出结果:

MON
TUE
SUN

上面是一个简单类实现枚举的代码,对于上面的if-else,写起来是不是很麻烦呢?如有还有许多个变量,那些if-else岂不是很麻烦,于是上面的代码还可以改进改进

/**
 * 用普通类实现枚举原理(用了抽象方法)
 * @author JSON
 *
 */
public abstract class WeekDay {
    /**
     * 私有构造函数方法,为了防止WeekDay被随便的实例化
     */
    private WeekDay(){}
    
    //定义静态常量星期一
    public final static WeekDay MON = new WeekDay(){

        @Override//这是注解(覆盖的意思)
        public WeekDay nextDay() {
            // TODO Auto-generated method stub
            return TUE;
        }

        @Override//这是注解(覆盖的意思)
        public String toString() {
            // TODO Auto-generated method stub
            return "MON";
        }
        
    };
    //定义静态常量星期二
    public final static WeekDay TUE = new WeekDay(){

        @Override//这是注解(覆盖的意思)
        public WeekDay nextDay() {
            // TODO Auto-generated method stub
            return SUN;
        }

        @Override//这是注解(覆盖的意思)
        public String toString() {
            // TODO Auto-generated method stub
            return "TUE";
        }
        
    };
    //定义静态常量星期天
    public final static WeekDay SUN = new WeekDay(){

        @Override//这是注解(覆盖的意思)
        public WeekDay nextDay() {
            // TODO Auto-generated method stub
            return MON;
        }

        @Override//这是注解(覆盖的意思)
        public String toString() {
            // TODO Auto-generated method stub
            return "SUN";
        }
        
    };
    /**
     * 获得下一天(抽象方法,类也要是抽象的类)
     * @return
     */
    public abstract WeekDay nextDay();
    /**
     * 打印名字的方法(抽象方法,类也要是抽象的类)
     */
    public abstract String toString();
}

public static void main(String[] args){
        //星期一的对象
        WeekDay mon = WeekDay.MON;
        System.out.println(mon.toString());
        System.out.println(mon.nextDay().toString());
        System.out.println(mon.nextDay().nextDay().toString());

}

输出结果:

MON
TUE
SUN

输出的结果是一样的,但是第二种方法比第一种方法更加的好一些。


           2.用枚举类的关键字来实现枚举

//定义一个枚举对象
    public enum WeekDay{
        SUN,MON,TUE,WED,THI,FRI,SAT
    }
    public static void main(String[] args){
        //全大写的命名方式是常量的
        WeekDay fri= WeekDay.FRI;
        System.out.println(fri);
        System.out.println(fri.name());//得到枚举对象的名字
        System.out.println(fri.ordinal());//排在几位
        System.out.println(fri.valueOf("SUN"));//返回带指定名称的指定枚举类型的枚举常量。(查看JDK帮助文档知道的)
        System.out.println(fri.valueOf("WED").toString());
        System.out.println(fri.values().length);
        System.out.println(fri.valueOf("AAA"));//输入一个不存在的枚举变量,编译没错,运行报错  
    }

输出结果:


当你看到这时,并且打印出了上面的结果,那就表明你掌握了枚举的入门。接下来更进一步的了解枚举,外带一个思考题。


//定义一个枚举对象
    public enum WeekDay{
        //public WeekDay(){};//这里会报错,原因为枚举的元素列表必须位于在所有的
        //成分之前,如果枚举的元素列表后有东西,那元素列表后面得有分号';'
        SUN(),MON(1),TUE,WED,THI,FRI,SAT;
//        public WeekDay(){};//这里用public会报错,原因是:枚举构造函数,只有私人的非法修改是允许的。(鼠标移到小红X上,把显示出来的英语拿给google翻译)
        private WeekDay(){System.out.println("first");};
        private WeekDay(int day){System.out.println("second");};
    }
    public static void main(String[] args){      
        //全大写的命名方式是常量的
        WeekDay weekDay2 = WeekDay.FRI;
    }

输出结果为:

first
second
first
first
first
first
first

     思考:SUN()和MON(1)与TUE和SUN()他们有区别吗?为什么?还有输出结果第二行为什么是“second”?-------这里面涉及了方法的重载哈



下面是枚举的最复杂的方式---------张孝祥老师说的

public enum TrafficLamp{
        //RED{}代表为TrafficLamp的子类
        RED(30){

            @Override
            public TrafficLamp nextLamp() {
                // TODO Auto-generated method stub
                return GREEN;
            }
            
        },
        //GREEN{}代表为TrafficLamp的子类
        GREEN(45){

            @Override
            public TrafficLamp nextLamp() {
                // TODO Auto-generated method stub
                return YELLWO;
            }
            
        },
        //YELLWO{}代表为TrafficLamp的子类
        YELLWO(5){

            @Override
            public TrafficLamp nextLamp() {
                // TODO Auto-generated method stub
                return RED;
            }
            
        };
        public abstract TrafficLamp nextLamp();
        private int time;
        private TrafficLamp(int time){
            this.time = time;
        }
    }


最后有个小知识点就是:枚举只有一个成员时,就可以作为一种单例的实现方法。


相关文章
|
6月前
|
存储 缓存 安全
缓存是黑客最爱渗透和攻击的一环。为什么?优雅草卓伊凡
缓存虽提升性能,却成黑客攻击重灾区:缓存中毒、投毒、穿透、时间戳攻击及泄露等手段频发,易致数据泄露、页面篡改、服务瘫痪。因其配置常被忽视、应用广泛、防御薄弱,亟需强化策略配置、输入验证、缓存隔离与HTTPS加密防护。(239字)
253 10
|
存储 人工智能 数据可视化
从需求到闭环:个人任务管理看板工具如何提升开发者每日效率?
现代人常陷入任务堆积、效率低下的困境。看板工具通过可视化任务状态、优先级排序和进度跟踪,为个人任务管理提供了高效解决方案。本文系统介绍了看板工具的核心原理(任务卡片、工作流)、主要功能(标签管理、多端同步)及主流产品对比(板栗看板、Notion等),并给出实用技巧:结合番茄工作法、定期复盘、避免任务堆积等。文章指出,看板不仅是工具,更是一种优化时间管理的思维方式,能有效减轻焦虑、提升生产力,适合学生、职场人士等各类人群。随着AI技术的发展,未来看板工具将更智能化,成为个人效率管理的得力助手。
473 0
|
人工智能 自然语言处理 语音技术
GPT-4o mini TTS:OpenAI 推出轻量级文本转语音模型!情感操控+白菜价冲击配音圈
GPT-4o mini TTS 是 OpenAI 推出的轻量级文本转语音模型,支持多语言、多情感控制,适用于智能客服、教育学习、智能助手等多种场景。
1294 2
GPT-4o mini TTS:OpenAI 推出轻量级文本转语音模型!情感操控+白菜价冲击配音圈
|
存储 人工智能 NoSQL
Tablestore深度解析:面向AI场景的结构化数据存储最佳实践
《Tablestore深度解析:面向AI场景的结构化数据存储最佳实践》由阿里云专家团队分享,涵盖Tablestore十年发展历程、AI时代多模态数据存储需求、VCU模式优化、向量检索发布及客户最佳实践等内容。Tablestore支持大规模在线数据存储,提供高性价比、高性能和高可用性,特别针对AI场景进行优化,满足结构化与非结构化数据的统一存储和高效检索需求。通过多元化索引和Serverless弹性VCU模式,助力企业实现低成本、灵活扩展的数据管理方案。
1020 12
|
KVM 虚拟化
KVM虚拟机的热迁移
这篇文章详细介绍了KVM虚拟机的热迁移过程,包括临时迁移和永久迁移的步骤,以及可能遇到的故障和解决方案。
976 1
KVM虚拟机的热迁移
|
JavaScript
Vue3数字输入框(InputNumber)
这是一个可定制的数字输入框组件,支持设置宽度、最小值、最大值、步长、精度等属性,并可添加前缀图标及自定义显示格式。组件兼容键盘快捷键操作,具备禁用功能。示例代码展示了如何使用该组件实现不同场景下的数值输入与格式化展示。组件还利用 `add` 函数解决了 JS 精度问题,并通过 `useSlotsExist` 监听插槽。
1185 7
Vue3数字输入框(InputNumber)
|
小程序 搜索推荐 Java
【技巧】如何在github主页放一条贪吃蛇
本文介绍了如何在GitHub主页上添加贪吃蛇动画,包括设置主页、生成提交记录动画和使用GitHub Action运行工作流程。通过详细步骤和截图演示,展示了从创建仓库到最终展示SVG动画的全过程,并提供了额外的个性化展示内容和相关文章推荐,旨在为读者带来乐趣并提升GitHub页面的趣味性。
861 1
【技巧】如何在github主页放一条贪吃蛇
|
存储 开发框架 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配
|
XML 安全 网络协议
Xxe外部实体注入(XML External Entity Injection)
Xxe外部实体注入(XML External Entity Injection)
|
安全 测试技术 网络安全