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();}}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部