什么是枚举类
使用enum定义的枚举类继承java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口,但是不能再进行继承(java不支持多继承)。
枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。
使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。
枚举类的构造器只能是私有的。
枚举类内也可以定义属性和方法,可是是静态的和非静态的
一个例子:
public enum EnumHero {
/**
* 影流之主 劫
*/
RIVEN("The Exile"){
@Override
public String getCname() {
return "劫";
}
},
/**
* 放逐之刃 锐雯
*/
ZED("The Master of Shadows"){
@Override
public String getCname() {
return "锐雯";
}
},
/**
* 盲僧 李青
*/
LEE_SIN("The Blind Monk"){
@Override
public String getCname() {
return "李青";
}
},
/**
* 暗夜猎手 薇恩
*/
VAYNE("The Night Hunter"){
@Override
public String getCname() {
return "薇恩";
}
},
/**
* 武器大师 贾克斯
*/
JAX("Grand master at Arms"){
@Override
public String getCname() {
return "贾科斯";
}
},
/**
* 刀锋意志 艾瑞利亚
*/
TRELIA("The Will of the Blades"){
@Override
public String getCname() {
return "艾瑞利亚";
}
};
private final String desc;
/**
* 构造方法必须私有!
* @param desc
*/
private EnumHero(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
/**
* 抽象方法由不同的枚举值提供不同的实现
* @return
*/
public abstract String getCname();
}
写枚举类实例的时候,默认是调用了构造器的,所以此处需要传入参数,因为没有显式申明无参构造器,只能调用有参数的构造器。
构造器需定义成私有的,这样就不能在别处申明此类的对象了。枚举类通常应该设计成不可变类,它的Field不应该被改变,这样会更安全,而且代码更加简洁。所以我们将Field用private final修饰。
枚举类可以实现一个或多个接口。与普通类一样,实现接口的时候需要实现接口中定义的所有方法,若没有完全实现,那这个枚举类就是抽象的,只是不需显式加上abstract修饰,系统会默认加上。
这个枚举类实际上是抽象的,不可以创建枚举值,所以此处在申明枚举值的时候,都实现了抽象方法,这其实是匿名内部类的实现,花括号部分是一个类体。我们可以通过编译后的class文件查看。
——————————————————————————
switch语句里的表达式可以是枚举值。
由于枚举类型确保JVM中仅存在一个常量实例,因此我们可以安全地使用"= =" 运算符比较两个变量。此外,"= ="运算符可提供编译时和运行时的安全性。
EnumSet 和EnumMap
EnumSet :
EnumSet 是一种专门为枚举类型所设计的 Set 类型。
与HashSet相比,由于使用了内部位向量表示,因此它是特定 Enum 常量集的非常有效且紧凑的表示形式。
它提供了类型安全的替代方法,以替代传统的基于int的“位标志”,使我们能够编写更易读和易于维护的简洁代码。
EnumSet 是抽象类,其有两个实现:RegularEnumSet 、JumboEnumSet,选择哪一个取决于实例化时枚举中常量的数量。
在很多场景中的枚举常量集合操作(如:取子集、增加、删除、containsAll和removeAll批操作)使用EnumSet非常合适;如果需要迭代所有可能的常量则使用Enum.values()。
EnumMap:
EnumMap是一个专门化的映射实现,用于将枚举常量用作键。与对应的 HashMap 相比,它是一个高效紧凑的实现,并且在内部表示为一个数组:
EnumMap<Pizza.PizzaStatus, Pizza> map;
总结:本文主要记录并参考了java中枚举相关知识点!
参考:用好Java中的枚举真的没有那么简单
【JAVA】浅谈java枚举类