聊聊Java枚举(enum)
1、什么是枚举
什么是枚举,百科上的解释:在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。
2、声明枚举
声明枚举时必须使用 enum 关键字,然后定义枚举的名称、可访问性、基础类型和成员等。枚举声明的语法如下:
enum-modifiers enum enumname:enum-base {
enum-body,
}
其中,enum-modifiers 表示枚举的修饰符主要包括 public、private 和 internal;enumname 表示声明的枚举名称;enum-base 表示基础类型;enum-body 表示枚举的成员,它是枚举类型的命名常数。
任意两个枚举成员不能具有相同的名称,且它的常数值必须在该枚举的基础类型的范围之内,多个枚举成员之间使用逗号分隔。
提示:如果没有显式地声明基础类型的枚举,那么意味着它所对应的基础类型是 int。
3、枚举方法
方法名称 | 描述 |
---|---|
values() | 以数组形式返回枚举类型的所有成员 |
valueOf() | 将普通字符串转换为枚举实例 |
compareTo() | 比较两个枚举成员在定义时的顺序 |
ordinal() | 获取枚举成员的索引位置 |
1、values
enum Season{
spring,summer,autumn,winter;
// 常量有 spring, summer, autumn,winter,分别表示春天,夏天,秋天,冬天,系统会自动添加 public static final 修饰
}
public class SeasonEnum {
public static void main(String[] args) {
// 迭代季节
for (Season season : Season.values()) {
System.out.println(season);
}
}
}
2、valueOf
enum Season{
spring,summer,autumn,winter;
// 常量有 spring, summer, autumn,winter,分别表示春天,夏天,秋天,冬天,系统会自动添加 public static final 修饰
}
public class SeasonEnum {
public static void main(String[] args) {
// 使用 valueOf() 返回枚举常量,不存在的会报错 IllegalArgumentException
System.out.println(Season.valueOf("summer"));
// System.out.println(Season.valueOf("summ"));
}
}
3、ordinal
enum Season{
spring,summer,autumn,winter;
// 常量有 spring, summer, autumn,winter,分别表示春天,夏天,秋天,冬天,系统会自动添加 public static final 修饰
}
public class SeasonEnum {
public static void main(String[] args) {
// 迭代季节
for (Season season : Season.values()) {
// ordinal可以找到每个枚举常量的索引,就像数组索引一样。
System.out.println(season+" 索引为 "+season.ordinal());
}
}
}
4、compareTo
int res1 = w1.compareTo(w2);
int res2 = w2.compareTo(w3);
int res3 = w3.compareTo(w4);
int res4 = w4.compareTo(w2);
int res5 = w5.compareTo(w6);
System.out.println("Is" + " " + w1.name() + " " + "same as" + " " + w2.name() + res1);
System.out.println("Is" + " " + w2.name() + " " + "same as" + " " + w3.name() + res2);
System.out.println("Is" + " " + w3.name() + " " + "same as" + " " + w4.name() + res3);
System.out.println("Is" + " " + w4.name() + " " + "same as" + " " + w2.name() + res4);
System.out.println("Is" + " " + w5.name() + " " + "same as" + " " + w6.name() + res5);
Is SUN same as MON-1
Is MON same as TUE-1
Is TUE same as WED-1
Is WED same as MON2
Is THU same as FRI-1
此方法的返回类型为int,它根据给定的情况返回一个整数值,
- 当此Enum对象等于或等于给定的Enum对象时,它将返回0。
- 当此Enum对象大于给定的Enum对象时,它将返回正值。
- 当此Enum对象小于给定的Enum对象时,它将返回负值。
4、自定义构造函数指定值和中文描述
enum Weekday {
MON(1, "星期一"), TUE(2, "星期二"), WED(3, "星期三"), THU(4, "星期四"), FRI(5, "星期五"), SAT(6, "星期六"), SUN(0, "星期日");
public final int dayValue;
private final String chinese;
private Weekday(int dayValue, String chinese) {
this.dayValue = dayValue;
this.chinese = chinese;
}
@Override
public String toString() {
return this.chinese;
}
}
public class SeasonEnum {
public static void main(String[] args) {
Weekday day = Weekday.SUN;
if (day.dayValue == 6 || day.dayValue == 0) {
System.out.println("Today is " + day + ". Work at home!");
} else {
System.out.println("Today is " + day + ". Work at office!");
}
// 使用 valueOf() 返回枚举常量,不存在的会报错 IllegalArgumentException
// System.out.println(Season.valueOf("summer"));
// System.out.println(Season.valueOf("summ"));
}
}
5、枚举类比较是用==还是equals
一般在Java代码里面,涉及到比较2个值的问题,除了是简单的一般数据类型意外,字符串除外,我们都是使用==来判断是否相等的,但是对于字符串和对象以及封装类型的数据都是使用equals方法,来判断2个值是否相等。
在枚举里面,使用== 和使用equals方法的执行结果是一样的。
因为在Enum类里面,已经重写了equals方法,而方法里面比较就是直接使用==,来比较2个对象的。所以,在外边直接使用==也是可以的。
转载自:https://juejin.cn/post/7148090723907141662