java - enum

第一章 枚举类型的定义

public enum 枚举类名{
	枚举项常量1,枚举项常量2,枚举项常量3;
	
	字段...;
	私有构造器...;
	方法...;
	...
}
//定义一个红绿灯的枚举类
public enum MyEnum {
    RED("red", "停止"),
    //RED常量     等价于 public static final RED = new MyEnum("red","停止");
    
    GREEN("green", "通行"),
    //GREEN常量   等价于 public static final GREEN = new MyEnum("green", "通行");
    
    YELLOW("yellow", "等一等");
    //YELLOW常量  等价于 public static final YELLOW = new MyEnum("yellow", "等一等");

    private String name;
    private String msg;

    private MyEnum() {
    }

    private MyEnum(String name, String msg) {
        this.name = name;
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "当前是" + name + "灯" + "请" + msg;
    }
}

第二章 枚举类型的理解

  • 枚举类是一个普通类 + 枚举项常量。隐式直接继承Enum类
  • 枚举类构造器必须都是private的,且必须写在枚举项常量的后面
  • 枚举项常量:
    • 枚举项其实是该枚举类型的静态实例对象。
    • 枚举项常量命名遵循常量命名规则。
    • 隐式修饰符为public static final (不需要自己写,也不能写)
    RED("red", "停止"),
	//等价于 public static final RED = new MyEnum("red","停止");

第三章 枚举的方法

  • 自定义的枚举类都隐式直接继承Enum抽象类
    在这里插入图片描述
非静态方法
public final String name(); 获取该枚举项
public final int ordinal(); 获取该枚举项的索引
静态方法 jvm自动添加的两个方法
public static 枚举类[] values(); 获取枚举项数组
public static 枚举类 valueOf(String str);获取特定枚举项
package enum_test;

import java.util.Arrays;

public class Demo07 {
    public static void main(String[] args) {
        SingleEnum instance = SingleEnum.INSTANCE1;

        System.out.println(instance.name());  // INSTANCE1
        
        System.out.println(instance.ordinal());// 0

        SingleEnum[] values = SingleEnum.values();
        System.out.println(Arrays.toString(values));//[INSTANCE1, INSTANCE2]

        SingleEnum instacne = SingleEnum.valueOf("INSTANCE1");
        System.out.println(instacne);// INSTANCE1

    }
}

enum SingleEnum {
    INSTANCE1,
    INSTANCE2;
}

在这里插入图片描述

第四章 枚举类型和普通常量的区别

先来看两个需求:

1. 需求一:根据当前是星期几调用不同的功能。比如商家,周末时会发放大额优惠券.

1.1 静态常量写法

  • 因为我们明确知道一周只有星期一、星期二、… 星期日这七个。因此可以将这七个变量抽取到一个专门类中保存,提高代码的复用性。
package enum_test;
public class Demo03 {
    public static void main(String[] args) {
        //调用
        method("星期一");
    }

    //实现需求
    public static void method(String day) {
        switch (day) {
            case DayOfWeek.MONDAY:
                //星期一独特的代码
                break;
            case DayOfWeek.TUESDAY:
                //星期二独特的代码
                break;
            case DayOfWeek.WEDNESDAY:
                //星期三独特的代码
                break;
            case DayOfWeek.THURSDAY:
                //星期四独特的代码
                break;
            case DayOfWeek.FRIDAY:
                //星期五独特的代码
                break;
            case DayOfWeek.SATURDAY:
                //星期六独特的代码
                break;
            case DayOfWeek.SUNDAY:
                //星期天独特的代码
                break;
        }
    }
}
//专门保存静态常量
class DayOfWeek {
    public static final String MONDAY = "星期一";
    public static final String TUESDAY = "星期二";
    public static final String WEDNESDAY = "星期三";
    public static final String THURSDAY = "星期四";
    public static final String FRIDAY = "星期五";
    public static final String SATURDAY = "星期六";
    public static final String SUNDAY = "星期七";
}

1.2 枚举写法

package enum_test;
public class Demo02 {
    public static void main(String[] args) {
   		//调用
        method(EnumDayOfWeek.SUNDAY);
    }
    
	//实现需求
    public static void method(EnumDayOfWeek day) {
        switch (day) {
            case MONDAY:
                //星期一独特的代码
                break;
            case TUESDAY:
                //星期二独特的代码
                break;
            case WEDNESDAY:
                //星期三独特的代码
                break;
            case THURSDAY:
                //星期四独特的代码
                break;
            case FRIDAY:
                //星期五独特的代码
                break;
            case SATURDAY:
                //星期六独特的代码
                break;
            case SUNDAY:
                //星期天独特的代码
                break;
        }
    }
}
//自定义的星期枚举类型
enum EnumDayOfWeek {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

看需求一,用常量写和用枚举写好像没什么区别?

在这里插入图片描述

2. 需求二:访问网页会有状态码和对应的描述,怎么用程序实现呢?

/*
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
*/

2.1 静态常量写法

package enum_test;

public class Demo05 {
    public static void main(String[] args) {
        //调用
        method(200);
    }
    //实现需求
    public static void method(int statusCode) {
        switch (statusCode){
            case StatusCode.STATUS_CODE_200:
                System.out.println(StatusCode.STATUS_CODE_200 + StatusCode.STATUS_MSG_200);
                break;
            case StatusCode.STATUS_CODE_301:
                System.out.println(StatusCode.STATUS_CODE_301 + StatusCode.STATUS_MSG_301);
                break;
            case StatusCode.STATUS_CODE_404:
                System.out.println(StatusCode.STATUS_CODE_404 + StatusCode.STATUS_MSG_404);
                break;
            case StatusCode.STATUS_CODE_500:
                System.out.println(StatusCode.STATUS_CODE_500 + StatusCode.STATUS_MSG_500);
                break;
        }
    }
}

class StatusCode {
    public static final int STATUS_CODE_200 = 200;
    public static final String STATUS_MSG_200 = "请求成功";

    public static final int STATUS_CODE_301 = 301;
    public static final String STATUS_MSG_301 = "资源(网页等)被永久转移到其它URL";

    public static final int STATUS_CODE_404 = 404;
    public static final String STATUS_MSG_404 = "请求的资源(网页等)不存在";

    public static final int STATUS_CODE_500 = 500;
    public static final String STATUS_MSG_500 = "内部服务器错误";
}

2.2 枚举写法

package enum_test;

public class Demo06 {
    public static void main(String[] args) {
        //调用
        method(EnumStatusCode.STATUS_CODE_500);
    }

    //实现需求
    public static void method(EnumStatusCode statusCode) {
        switch (statusCode) {
            case STATUS_CODE_200:
                System.out.println(EnumStatusCode.STATUS_CODE_200);
                break;
            case STATUS_CODE_301:
                System.out.println(EnumStatusCode.STATUS_CODE_301);
                break;
            case STATUS_CODE_404:
                System.out.println(EnumStatusCode.STATUS_CODE_404);
                break;
            case STATUS_CODE_500:
                System.out.println(EnumStatusCode.STATUS_CODE_500);
                break;
        }
    }
}

enum EnumStatusCode {
    STATUS_CODE_200(200, "请求成功"),

    STATUS_CODE_301(301, "资源(网页等)被永久转移到其它URL"),

    STATUS_CODE_404(404, "请求的资源(网页等)不存在"),

    STATUS_CODE_500(500, "内部服务器错误");

    private int code;
    private String msg;

    EnumStatusCode() {
    }

    EnumStatusCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    @Override
    public String toString() {
        return "状态码:" + code + " msg:" + msg;
    }
}
  • 从需求二我们可以看出,枚举类型的常量更加灵活,可以附带信息和行为,封装性好方便使用。

3. 什么时候使用枚举呢?

  • 首先,枚举不是必须的,要根据情况来定。不是定义枚举类型就一定比定义一组常量好,不是绝对的。
  • 用枚举实现单例
public enum Singleton {
    INSTANCE
    
    //单例其他方法
    ....
}

第四章 参考资料

B站视频

为什么我喜欢枚举(1)–语法糖而已

百度百科

为什么建议你使用枚举?

整明白枚举单例模式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值