Java - 枚举
枚举:
定义枚举:
使用enum关键字定义
class Test {
enum Day {
SATURDAY, SUNDAY
}
public static void main(String[] args) {
Day day = Day.SATURDAY;
System.out.println(day);
}
}
枚举实质:
首先枚举的父类并不是Enum
, 而是枚举中的枚举常量的父类才是Enum
, 在上面代码中, Test
类就是枚举, STATURDAY
就是枚举常量
枚举的父类
public abstract class Enum<E extends Enum<E>>
implements Constable, Comparable<E>, Serializable {
private final String name; // 枚举常量的名字, enmu中定以的是什么name就是什么
public final String name() {
return name;
}
private final int ordinal; // 枚举常量的位置, 定义顺序决定
public final int ordinal() {
return ordinal;
}
}
enum
关键字定义的类中的所有以逗号分隔且没有任何修饰符的属性, 实际上是一个继承Enum
的public static final class
每个enum类都会自动生成一个private static final $VALUES
属性, 是一个数组用于存放枚举常量
属性和方法:
枚举中可以定义属性, 像这样
public enum Status {
DRAFT,
PUBLISH,
DELETED;
private final Integer value;
private final String message;
public static void test() {
}
public Integer getValue() {
return value;
}
public String getMessage() {
return message;
}
}
需要注意的是上面代码定义的是非static的属性这些属性并不属于Status
而是属于每个枚举常量, 那么如果定义的属性为static才是属于Status
, 方法同理
构造器:
枚举类中声明的构造器实际上是枚举常量的构造器, 构造器总是private
的
声明的构造器虽然看起来像是枚举的构造器, 但是实际上是为每个枚举常量声明的私有构造器, 并不属于枚举
enum Status {
DRAFT(0, "草稿"),
PUBLISH(1, "已发布"),
DELETED(2, "已删除");
private final Integer id;
private final String message;
/*
* Status status = new Status(1, "2");是错误的, 编译出错, 因为这个构造器并不属于Status
*/
Status(int id, String message) {
this.id = id;
this.message = message;
}
/*
* 这个方法实现的是通过id来拿到对应的枚举
*/
public static Status valueOf(int id) {
if (id > 2) {
return null;
}
for (Status statu : Status.values()) {
if (statu.id == id) {
return statu;
}
}
return null;
}
public Integer getId() {
return id;
}
public String getMessage() {
return message;
}
}