枚举是一种特殊的数据类型,它在 Java 中被用来定义一组具名的常量。比如,你可以定义一个表示一周七天的枚举,里面的元素就是 “MONDAY”“TUESDAY” 等这样固定的常量值,它使得代码更加清晰、易于维护,并且限制了变量只能取预定义好的值,避免了随意赋值带来的混乱。可以把枚举认为是特别的类,但是这个类能实例化的对象是在类产生时就写好的。
以下是一个简单的枚举定义示例:
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY;
}
花括号内列举出了这个枚举类型包含的所有枚举常量,它们之间用逗号隔开,最后一个常量后面可以跟一个分号(分号也可省略,不过如果枚举中有其他方法、构造函数等内容时,就需要加上分号)。
public class Test3 {
public static void main(String[] args) {
//声明一个变量
Day d = Day.FRIDAY;
printDay(d);
}
private static void printDay(Day d) {
System.out.println("今天是"+d);
}
}
switch
语句中使用:package test3;
public class Test4 {
public static void main(String[] args) {
Day d = Day.FRIDAY;
whatDay(d);
}
private static void whatDay(Day d) {
switch (d){
case FRIDAY:
System.out.println("周末到咯!~");
break;
case MONDAY:
System.out.println("打工人的一周开始了");
break;
case SUNDAY:
case SATURDAY:
System.out.println("愉快的周末!");
break;
default:
System.out.println("平常的一天");
break;
}
}
}
在 switch
语句中,以枚举作为表达式,根据不同的枚举常量执行不同的代码逻辑,这样代码结构清晰且易读。
public enum Day {
MONDAY("忙碌的开始"),
TUESDAY("继续加油"),
WEDNESDAY("周中啦"),
THURSDAY("快到周末了"),
FRIDAY("期待周末"),
SATURDAY("休息咯"),
SUNDAY("放松的一天");
private String description;
Day(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
在这个 Day
枚举中,每个枚举常量都关联了一个描述信息。通过定义构造函数(构造函数默认是 private
的,不能被外部显式调用)为枚举常量初始化属性,并且定义了 getDescription
方法来获取该属性值。可以像这样使用:
Day today = Day.MONDAY;
System.out.println(today.getDescription());
interface Wearable {
void wear();
}
这里定义了 Workable
接口,Day
枚举实现了该接口,不同的枚举常量可以根据自身情况有不同的接口方法实现方式(对于 SATURDAY
和 SUNDAY
这种休息的日子,就采用默认的 “今天休息,不用工作” 逻辑),然后可以这样调用:
Day today = Day.MONDAY;
today.doWork();
package Test4;
public enum Season implements Wearable {
SPRING("春天来了"){
@Override
public void wear() {
System.out.println("脱棉袄");
}
},
SUMMER("最爱夏天"){
@Override
public void wear() {
System.out.println("穿短袖了");
}
},
AUTUMN("层林浸染啊"){
@Override
public void wear() {
System.out.println("穿长袖");
}
},
WINTER("北国风光,千里冰封"){
@Override
public void wear() {
System.out.println("穿棉袄");
}
};
private final String disc;
Season(String disc) {
this.disc = disc;
}
public void getDis(){
System.out.println(this.disc);
}
}
总之,Java 枚举是一种很实用的语言特性,在很多需要定义一组固定常量值的场景中能让代码更加规范、可读且便于维护。
Java 中的 Enum
类提供了一些很有用的方法,以下是对它们的详细介绍:
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY
}
public class EnumMethodExample {
public static void main(String[] args) {
Day day = Day.MONDAY;
System.out.println(day.name());
}
}
在上述代码中,通过调用 day.name()
,会输出 "MONDAY"
,因为这就是枚举常量 MONDAY
的名称。
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY
}
public class EnumMethodExample {
public static void main(String[] args) {
Day monday = Day.MONDAY;
Day tuesday = Day.TUESDAY;
System.out.println(monday.ordinal()); // 输出 0
System.out.println(tuesday.ordinal()); // 输出 1
}
}
name()
方法得到的结果,也就是枚举常量的名称。不过,在实际应用中,如果对枚举类重写了 toString()
方法,那么就会按照重写后的逻辑返回相应字符串。public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY
}
public class EnumMethodExample {
public static void main(String[] args) {
Day day = Day.MONDAY;
System.out.println(day.toString()); // 输出 "MONDAY",和day.name()结果一样
}
}
toString()
示例:public enum Day {
MONDAY {
@Override
public String toString() {
return "忙碌的周一";
}
},
TUESDAY {
@Override
public String toString() {
return "继续奋斗的周二";
}
},
WEDNESDAY {
@Override
public String toString() {
return "周中的周三";
}
}
}
public class EnumMethodExample {
public static void main(String[] args) {
Day day = Day.MONDAY;
System.out.println(day.toString()); // 输出 "忙碌的周一",按重写后的逻辑输出
}
}
Enum
类的静态方法)IllegalArgumentException
异常。public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY
}
public class EnumMethodExample {
public static void main(String[] args) {
Day day = Enum.valueOf(Day.class, "TUESDAY");
System.out.println(day); // 输出 "TUESDAY"
}
}
在上述代码中,通过指定 Day
枚举类型以及要查找的常量名称 "TUESDAY"
,就能获取到对应的 Day.TUESDAY
这个枚举常量。但如果写成 Enum.valueOf(Day.class, "FRIDAY")
(假设 Day
枚举中原本没定义 FRIDAY
这个常量),就会抛出异常。
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY
}
public class EnumMethodExample {
public static void main(String[] args) {
Day[] days = Day.values();
for (Day d : days) {
System.out.println(d);
}
}
}
上述代码通过 Day.values()
获取到 Day
枚举所有常量组成的数组,然后利用循环遍历输出每个枚举常量,会依次输出 "MONDAY"
、"TUESDAY"
、"WEDNESDAY"
。
用来比较两个枚举对象在声明时的次序
public enum Ha {
FIRST,SECOND;
public static void main(String[] args) {
Ha h = FIRST;
System.out.println(h.compareTo(SECOND));
}
}
compareTo的内部逻辑是,前一个的值减去后一个,再次代码中就是FIRST-SECOND,结果为负数,表示FIRST比SECOND小,也就是FIRST在SECOND之前。
枚举类的构造函数默认是 private
权限。这是因为枚举类型旨在表示一组固定的常量值,从设计角度来讲,不希望外部代码能够随意去创建新的枚举实例(除了定义好的那些枚举常量)。通过将构造函数默认设置为 private
,就限制了只能在枚举类的内部使用这个构造函数来初始化那些预定义的枚举常量,保证了枚举的完整性和不可变特性。