JavaSE进阶--枚举
文章目录
- 一、介绍
- 1、概念
- 2、好处
- 3、特点
- 二、自定义枚举
- 1、 JDK1.5之前
- 2、 JDK1.5开始
- 3、 两者区别
- 三、常用方法
- 四、应用场景
- 1、结合接口
- 2、增强get方法
- 3、设计模式
- 3.1 单例
- 3.2 责任链
📢 大家好,我是程序员Forlan,本篇内容主要分享Java中的枚举,属于基础内容,通过概念入手,自定义枚举,了解常用方法,知道其应用场景~
一、介绍
一般,有限个固定值,也就是一组常量,往往就会使用枚举
1、概念
在Java中,类的对象是有限个,确定的,这个类我们就可以定义为枚举类,如下:
性别:男女
月份:1,2…12
星期:一、二…日
2、好处
- 提高可读性,比如一个int类型,直接设置为1,根据就不知道什么意思,一头雾水,使用枚举,命名好,不用看注释就能知道什么意思
- 解耦,好扩展,常量值变动,直接改对应枚举值就行
3、特点
- 任意两个枚举成员不能具有相同的名称
- 多个枚举成员之间使用逗号分隔,最后一个成员用分号
- 枚举类型成员都可以看作是 Enum 类的实例,被public static final修饰
- 构造器默认使⽤private修饰
- 一般禁止写set方法,因为基本是只读的,写上也不会报错
二、自定义枚举
1、 JDK1.5之前
使用类常量
public class ProgrammingLanguage {private final Integer id;private final String desc;private ProgrammingLanguage(Integer id, String desc) {this.id = id;this.desc = desc;}public static final ProgrammingLanguage JAVA = new ProgrammingLanguage(1, "java");public static final ProgrammingLanguage PYTHON = new ProgrammingLanguage(2, "python");public static final ProgrammingLanguage GOLANG = new ProgrammingLanguage(3, "go");public static final ProgrammingLanguage C = new ProgrammingLanguage(4, "c");public static final ProgrammingLanguage PHP = new ProgrammingLanguage(5, "php");public Integer getId() {return id;}public String getDesc() {return desc;}}
2、 JDK1.5开始
使用 enum 关键字声明枚举
public enum ProgrammingLanguageEnum {JAVA(1, "java"),PYTHON(2, "python"),GOLANG(3, "go"),C(4, "c"),PHP(5, "php");private Integer id;private String desc;ProgrammingLanguageEnum(Integer id, String desc) {this.id = id;this.desc = desc;}public Integer getId() {return id;}public String getDesc() {return desc;}}
最简单的写法,没有显式地声明属性的话,构造器,方法都可以省了不写
public enum SexEnum {MAN,WOMAN;
}
3、 两者区别
- 使用 enum 关键字声明枚举类的上层父类 :java.lang.Enum
- 使用类常量实现枚举类的上层父类:java.lang.Object
三、常用方法
- name():返回枚举常量的名称
- ordinal():返回枚举常量的序号(它在枚举声明中的位置,其中初始常量被分配为零序数)
- toString():返回枚举常量的名称
- values():返回枚举类对象的数组
- valueOf():通过对象名字获取这个枚举对象,对象的名字必须传正确,区分大小写,否则抛出异常
ProgrammingLanguage programmingLanguage = ProgrammingLanguage.JAVA;
System.out.println(programmingLanguage.name());
System.out.println(programmingLanguage.ordinal());
System.out.println(programmingLanguage);
// 返回枚举对象的数组
ProgrammingLanguage[] values = ProgrammingLanguage.values();
for (ProgrammingLanguage value : values) {System.out.println(value);
}
// 通过对象名字获取这个枚举对象
// 对象的名字必须传正确,区分大小写,否则抛出异常
ProgrammingLanguage programmingLanguage1 = ProgrammingLanguage.valueOf("JAVA");
System.out.println(programmingLanguage1);
关于name和toString的疑惑,两者好像都是返回一样的?那应该使用哪个?
大多数程序员应该优先使用 toString 方法,因为 toString 方法可能会返回更用户友好的名称。此方法主要用于正确性取决于获取确切名称的特殊情况,该名称不会因版本而异
四、应用场景
1、结合接口
定义接口,统一枚举方法,枚举类实现接口,实现不同对象调用不同方法
public enum ProgrammingLanguage implements Forlan{JAVA(1, "java"){@Overridepublic void print() {System.out.println("Forlan,这是java");}},PYTHON(2, "python"){@Overridepublic void print() {System.out.println("Forlan,这是python");}},GOLANG(3, "go"){@Overridepublic void print() {System.out.println("Forlan,这是go");}},C(4, "c"){@Overridepublic void print() {System.out.println("Forlan,这是c");}},PHP(5, "php"){@Overridepublic void print() {System.out.println("Forlan,这是php");}};...
2、增强get方法
通过属性值找到对应的属性值
public static Integer getId(String desc) {for (ProgrammingLanguageEnum vlaue : values()) {if (vlaue.desc.equals(desc)) {return vlaue.getId();}}return null;
}
public static String getDesc(Integer id) {for (ProgrammingLanguageEnum value : values()) {if (value.getId().equals(id)) {return value.getDesc();}}return "未知";
}
3、设计模式
3.1 单例
引用枚举值,作为参数
ProgrammingLanguage programmingLanguage = ProgrammingLanguage.JAVA;
3.2 责任链
public enum FilterTypeEnum {BEFORE {@Overridepublic FilterTypeEnum doFilter() {System.out.println("执行前过滤");return AROUND;}},AROUND {@Overridepublic FilterTypeEnum doFilter() {System.out.println("执行中过滤");return AFTER;}},AFTER {@Overridepublic FilterTypeEnum doFilter() {System.out.println("执行后过滤");return null;}};public abstract FilterTypeEnum doFilter();public static void main(String[] args) {FilterTypeEnum filterTypeEnum = FilterTypeEnum.BEFORE;while (filterTypeEnum != null) {filterTypeEnum = filterTypeEnum.doFilter();}}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
