枚举(enum)
所谓枚举 -- 是一种取值范围固定在某个指定集当中的数据类型。 定义的语法:
public enum 枚举类型名{
值选项1,值选项2,....,值选项n;
}
注意点: 1、这里的值选项是标识符,不是字符串; 2、这里的值选项是有顺序的; 3、值选项不能重复。
使用的语法:
枚举类型 变量 = 枚举类型.值选项;
枚举的本质
枚举其实是一个语法糖,在本质它是一个自动继承于Enum类的子类。 Enum类来自于java.lang包,是一个抽象类。Enum拥有的属性行为,所有的枚举类型都拥有。
属性
name -- 选项名字 String
ordinal -- 选项的序号 int
这两个属性都是私有的常量,也就是说外部不可访问,同时一旦产生Enum对象以后其值也不能修改。
非static方法
name() -- 返回选项的名字
Season now = Season.SPRING;
now = Season.AUTUMN;
System.out.println(now.name());
ordinal() -- 返回选项的序号
now.ordinal();
compareTo() -- 比较两个枚举对象的大小,返回的是它们的序号差
System.out.println(now.compareTo(Season.SPRING));
另外凡是来自于Object类的方法,它都有。包括:
equals() -- 判断两个枚举对象是否相等
toString()-- 返回枚举的字符串描述,其实重写后就是返回的name
static方法
values() -- 以数组的形式返回这个枚举类里面有哪些选项。
Season [] all = Season.values();
for (Season season : all){
System.out.println(season);
}
valueof -- 根据字符串名获取枚举实例
System.out.println(Season.valueOf("SPRING"));
注意:
- enum枚举就是类类型;
- 父类是Enum是一个抽象类,来自于java.lang包;
- 常用方法:
`compareTo()`
`equals()`
`values()`
枚举的高阶使用
-
在自定义的enum类型中可以增加属性;
private String value;//存放每个成员的中文打印值 -
在自定义的enum类型中可以增加行为;
普通方法(静态或非静态)
public static Season getSeasonByChinese(String chinese){ return switch (chinese){ case "春": case "春天": yield Season.SPRING; case "夏": case "夏天": yield Season.SUMMER; case "秋": case "秋天": yield Season.AUTUMN; case "冬": case "冬天": yield Season.WINTER; default: throw new IllegalStateException("Unexpected value: " + chinese); }; } public String getChineseByEnum(Season season){ return switch (season){ case SPRING -> "春"; case SUMMER -> "夏"; case AUTUMN-> "秋"; case WINTER-> "天"; default -> throw new IllegalStateException("Unexpected value: " + season); }; } } -
在自定义的enum类型中可以重写从Enum中继承而来的方法
@Override public String toString(){ //TODO return this.value } -
在自定义的enum类型中可以增加构造(完成自我阅读学习)。
枚举的构造只能是私有的
private Season(String value){ this.value = value; }
记录(record)
在JDK14当中,提供了一种新的类型叫做record(记录)。它是专门用来定义一种特殊类的“简化语法”。
什么样的特殊类呢? 专门用来存放属性值,且每个属性的值一旦确立不能修改。这种类的预设场景是在做数据传输的时候。 用传统语法做这种类的设计,写起来比较麻烦。因此专门设计了record类型的语法。
定义语法:
//这里()里面既可以称之为参数,也可以称为属性
public record 名字(书写上参数){
}
然后它自动生成带参构造,自动生成final属性,自动生成与属性名保持一致的get方法,自动重写toString()
record的本质
也是语法糖,它也是类类型,它父类是来自于java.lang.Record的抽象类。