java枚举
枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。
枚举的属性
- 枚举类对象的属性不应允许被改动,所以应该使用private final 修饰
- 枚举类的使用privatefinal修饰的属性应该在构造器中为其赋值
- 若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数
声明枚举
jdk1.5之前声明枚举
没有enum关键字需要自己自定义枚举
public enum SeasonEnum2 {
SPRING("春天","春日暖暖"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","白雪皑皑");
private final String seasonName;
private final String seasonDesc;
SeasonEnum2(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
jdk1.5后声明枚举
使用enum关键字定义枚举类
enum-modifiers enum enumname{
enum-body1,
enum-body2;
}
- enum-modifiers 代表访问修饰符
- enumname 代表枚举名称
- enum-body 代表枚举成员用逗号隔开,分号结尾
public enum SeasonEnum2{
SPRING("春天","春日暖暖"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","白雪皑皑");
final String seasonName;
final String seasonDesc;
SeasonEnum2(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
枚举类
Java 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。
/**
返回此枚举常量的序号(它在其枚举声明中的位置,其中初始常量的序号为零)。
大多数程序员不会使用这种方法。它设计用于复杂的基于枚举的数据结构,
例如java.util.EnumSet和java.util.EnumMap 。
返回: 此枚举常数的序数
*/
public final int ordinal() ;
/**
返回具有指定名称的指定枚举类型的枚举常量。该名称必须与用于在此类型中声明枚举常量的标识符完全匹配。 (不允许使用无关的空白字符。)
请注意,对于特定的枚举类型T ,可以使用该枚举上隐式声明的public static T valueOf(String)方法而不是此方法来从名称映射到相应的枚举常量。枚举类型的所有常量都可以通过调用该类型的隐式public static T[] values()方法获得。
参数:enumType – 要从中返回常量的枚举类型的Class对象 name - 要返回的常量的名称
回报:具有指定名称的指定枚举类型的枚举常量
抛出:IllegalArgumentException – 如果指定的枚举类型没有具有指定名称的常量,或者指定的类对象不代表枚举类型
NullPointerException – 如果enumType或name为 null
*/
@NotNull
public static <T extends Enum<T>> T valueOf(@NotNull Class<T> enumType,@NotNull String name ){
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum constant " + enumType.getCanonicalName() + "." + name);
}
/**
将此枚举与指定的对象进行比较以进行排序。返回负整数、零或正整数,因为此对象小于、等于或大于指定对象。
枚举常量仅可与相同枚举类型的其他枚举常量进行比较。此方法实现的自然顺序是声明常量的顺序。
*/
public final int compareTo(E o) {
Enum<?> other = (Enum<?>)o;
Enum<E> self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
EnumMap 与 EnumSet
为了更好地支持枚举类型,java.util 中添加了两个新类:EnumMap 和 EnumSet。使用它们可以更高效地操作枚举类型。
EnumMap 类
- EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其他的 Map(如 HashMap)实现也能完成枚举类型实例到值的映射,但是使用 EnumMap 会更加高效。
- HashMap 只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值,使得 EnumMap 的效率非常高。
EnumSet 类
EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。EnumSet 提供了许多工厂方法以便于初始化