enum
通过static final来定义常量
在Java中,我们可以通过static final来定义常量。例如,我们希望定义周一到周日这7个常量,可以用7个不同的int表示:
public class Weekday {
public static final int SUN = 0;
public static final int MON = 1;
public static final int TUE = 2;
public static final int WED = 3;
public static final int THU = 4;
public static final int FRI = 5;
public static final int SAT = 6;
}
使用常量的时候,可以这么引用:
if (day == Weekday.SAT || day == Weekday.SUN) {
// TODO: work at home
}
也可以把常量定义为字符串类型,例如,定义3种颜色的常量:
public class Color {
public static final String RED = "r";
public static final String GREEN = "g";
public static final String BLUE = "b";
}
使用常量的时候,可以这么引用:
String color = ...
if (Color.RED.equals(color)) {
// TODO:
}
字符串的比较都是比较组成字符串对象的每个字符是否相同,因此字符串的比较只会使用equals方法,不会使用==方法。
使用这些常量来表示一组枚举值的时候,有一个严重的问题就是,编译器无法检查每个值的合理性。比如我们定义一个颜色变量String color = ...
,但是除了指向常量的三种颜色,也可以指向任意的字符串,但是颜色变量我们只希望用来存储三种颜色,与预期不符。
class Color {
public static final String RED = "r";
public static final String GREEN = "g";
public static final String BLUE = "b";
}
public class Hello {
public static void main(String[] args) {
String color = Color.RED;
System.out.println(color);
color = "Hi Michael!"; // r
System.out.println(color); // Hi Michael!
}
}
enum
像上面定义常量的方式,并不能实现颜色变量color指向的一定是颜色常量,日期变量day的取值也可以是任意整数,不好管理。所以就有了枚举。
不同用途的常量可以定义对应的枚举类,编译器能自动检查某个值在枚举的集合内,我们可以使用enum来定义枚举类:
enum Weekday {
SUN, MON, TUE, WED, THU, FRI, SAT;
}
public class Hello {
public static void main(String[] args) {
Weekday day = Weekday.SUN;
// 输出 Work at home!
if (day == Weekday.SAT || day == Weekday.SUN) {
System.out.println("Work at home!");
} else {
System.out.println("Work at office!");
}
}
}
switch与enum是黄金搭档
switch与enum是黄金搭档,使用switch语句的时候更适合传入enum参数,而不是int参数或String参数。
enum Weekday {
SUN, MON, TUE, WED, THU, FRI, SAT;
}
public class Hello {
public static void main(String[] args) {
Weekday day = Weekday.SUN;
switch(day) {
case MON,TUE,WED,THU,FRI -> System.out.println("Today is " + day + ". Work at office!");
case SAT,SUN -> System.out.println("Today is " + day + ". Work at home!");
default-> throw new RuntimeException("cannot process " + day);
}
}
}
他の者にできたか?ここまでやれたか?この先できるか?いいや、仆にしかできない!