枚举类
什么是枚举?
是列出某些有穷序列集的所有成员。
举例:表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。
java中的枚举:为了让编译器自动检查某个值是否在枚举的集合内,产生了枚举的定义,可以用enum来定义枚举。
public class Main {
public static void main(String[] args) {
Weekday day = Weekday.SUN;
if (day == Weekday.SAT || day == Weekday.SUN) {
System.out.println("Work at home!");
} else {
System.out.println("Work at office!");
}
}
}
enum Weekday {
SUN, MON, TUE, WED, THU, FRI, SAT;
}
枚举的比较:可以直接用‘==’来比较。也可以用equals()比较
枚举的类型:枚举定义的类型和其他class没有区别,可以说枚举(enum)定义的类型就是class。
特点:
- 定义的enum类型总是继承自java.lang.Enum,且无法被继承;
- 只能定义出enum的实例,而无法通过new操作符创建enum的实例;
- 定义的每个实例都是引用类型的唯一实例;
- 可以将enum类型用于switch语句。
枚举中的方法
- name():返回常量名
String s = Weekday.SUN.name(); // "SUN"
- ordinal():返回常量定义的顺序
int n = Weekday.MON.ordinal(); // 1
switch:前面说过枚举更适合用在switch语句中
public class Main {
public static void main(String[] args) {
Weekday day = Weekday.SUN;
switch(day) {
case MON:
case TUE:
case WED:
case THU:
case FRI:
System.out.println("Today is " + day + ". Work at office!");
break;
case SAT:
case SUN:
System.out.println("Today is " + day + ". Work at home!");
break;
default:
throw new RuntimeException("cannot process " + day);
}
}
}
enum Weekday {
MON, TUE, WED, THU, FRI, SAT, SUN;
}
记录类
String和包装类型中有两个特点:
- 定义class时使用final,无法派生子类;
- 每个字段使用final,保证创建实例后无法修改任何字段。
在实际情况中也有这样的需求,因此产生了记录类,用关键字record
定义:
public record Point(int x, int y) {
//在这里可以编写构造方法和普通的方法。
}
实际编译之后的结果为:
public final class Point extends Record {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int x() {
return this.x;
}
public int y() {
return this.y;
}
public String toString() {
return String.format("Point[x=%s, y=%s]", x, y);
}
public boolean equals(Object o) {
...
}
public int hashCode() {
...
}
}