enum 的全称为 enumeration,是JDK 1.5 中引入的新特性,存放在 java.lang 包中。
原始的接口定义常量
public interface IConstants {
String MON = "Mon";
String TUE = "Tue";
String WED = "Wed";
String THU = "Thu";
String FRI = "Fri";
String SAT = "Sat";
String SUN = "Sun";
}
语法(定义)
创建枚举类型要使用enum关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum
public enum WeekEnum {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
这段代码实际上调用了7次 Enum(String name, int ordinal):
new Enum<WeekEnum>("MONDAY",0);
new Enum<WeekEnum>("TUESDAY",1);
new Enum<WeekEnum>("WEDNESDAY",2);
... ...
遍历、switch 等常用操作
对enum进行遍历和switch的操作示例代码:
public class TestEnum {
public static void main(String[] args) {
for (WeekEnum e : WeekEnum.values()) {
System.out.println(e.toString());
}
System.out.println("------");
WeekEnum week = WeekEnum.TUESDAY;
switch (week) {
case MONDAY:
System.out.println("今天是星期一");
break;
case TUESDAY:
System.out.println("今天是星期二");
break;
// ... ...
default:
System.out.println(week);
break;
}
}
}
// 输出结果:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY
------
今天是星期二
enum 对象的常用方法介绍
int compareTo(E o) 比较此枚举与指定对象的顺序。
Class
String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String toString() 返回枚举常量的名称,它包含在声明中。
static <T extends Enum
public class TestEnumFun {
public static void main(String[] args) {
WeekEnum tuesday = WeekEnum.TUESDAY;
// compareTo(E o)
switch (tuesday.compareTo(WeekEnum.MONDAY)) {
case -1:
System.out.println("TUE 在 MON 之前");
break;
case 1:
System.out.println("TUE 在 MON 之后");
break;
default:
System.out.println("TUE 与 MON 在同一位置");
break;
}
// getDeclaringClass()
System.out.println("getDeclaringClass(): " + tuesday.getDeclaringClass().getName());
// name() 和 toString()
System.out.println("name(): " + tuesday.name());
System.out.println("toString(): " + tuesday.toString());
// ordinal(), 返回值是从 0 开始
System.out.println("ordinal(): " + tuesday.ordinal());
}
}
// 输出结果:
TUE 在 MON 之后
getDeclaringClass(): com.demo.enu.WeekEnum
name(): TUESDAY
toString(): TUESDAY
ordinal(): 1
给 enum 自定义属性和方法
给 enum 对象加一下 value 的属性和 getValue() 的方法:
/**
* 枚举类
*/
public enum WeekDetailEnum {
MONDAY("星期一", 1), TUESDAY("星期二", 2), WEDNESDAY("星期三", 3), THURSDAY("星期四", 4), FRIDAY("星期五", 5),
SATURDAY("星期六", 6) {
@Override
public boolean isRest() {
return true;
}
},
SUNDAY("星期日", 7) {
@Override
public boolean isRest() {
return true;
}
};
private String name;
private int value;
WeekDetailEnum(String name, int value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public int getValue() {
return value;
}
public boolean isRest() {
return false;
}
}
// 测试
System.out.println(WeekDetailEnum.SATURDAY.getName() + " 是否休息:" + WeekDetailEnum.SATURDAY.isRest());
// 输出结果:
星期六 是否休息:true
EnumSet,EnumMap 的应用
// EnumSet的使用
EnumSet<WeekDetailEnum> all = EnumSet.allOf(WeekDetailEnum.class);
for (WeekDetailEnum day : all) {
System.out.println(day.name() + ":" + day.getName());
}
System.out.println("-----------");
// EnumMap的使用
EnumMap<WeekDetailEnum, String> enumMap = new EnumMap<>(WeekDetailEnum.class);
for (WeekDetailEnum day : all) {
enumMap.put(day, day.isRest() ? "休息日" : "工作日");
}
Iterator<Entry<WeekDetailEnum, String>> it = enumMap.entrySet().iterator();
while (it.hasNext()) {
Entry<WeekDetailEnum, String> entry = it.next();
System.out.println(entry.getKey().getName() + "是" + entry.getValue());
}
// 结果打印
MONDAY:星期一
TUESDAY:星期二
WEDNESDAY:星期三
THURSDAY:星期四
FRIDAY:星期五
SATURDAY:星期六
SUNDAY:星期日
-----------
星期一是工作日
星期二是工作日
星期三是工作日
星期四是工作日
星期五是工作日
星期六是休息日
星期日是休息日
原理分析
enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum
Compiled from "WeekDetailEnum.java"
public class com.demo.enu.WeekDetailEnum extends java.lang.Enum<com.demo.enu.WeekDetailEnum> {
public static final com.demo.enu.WeekDetailEnum MONDAY;
public static final com.demo.enu.WeekDetailEnum TUESDAY;
public static final com.demo.enu.WeekDetailEnum WEDNESDAY;
public static final com.demo.enu.WeekDetailEnum THURSDAY;
public static final com.demo.enu.WeekDetailEnum FRIDAY;
public static final com.demo.enu.WeekDetailEnum SATURDAY;
public static final com.demo.enu.WeekDetailEnum SUNDAY;
public static com.demo.enu.WeekDetailEnum[] values();
public static com.demo.enu.WeekDetailEnum valueOf(java.lang.String);
public java.lang.String getName();
public int getValue();
public boolean isRest();
static {};
}
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
总结
可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。
标签:String,枚举,WeekDetailEnum,println,public,out From: https://www.cnblogs.com/saltish/p/16584455.html