枚举类的介绍
Java 枚举类是一个特殊的类,一般用来表示有限且固定的对象,例如季节类,它只有四个对象(春、夏、秋、冬)。
早期我们可能会直接使用简单的静态常量来表示枚举类,例如下面代码
public static final int SEASON_SPRING = 1;
public static final int SEASON_SUMMER = 2;
public static final int SEASON_FALL = 3;
public static final int SEASON_WINTER = 4;
这种定义很简单明了,同时存在以下问题:
- 类型不安全:上面的季节实际上都是一个 int 整数,完全可以进行加法运算 SEASON_SPRING+SEASON_SUMMER,这样的代码完全正常。
- 打印输出意义不明确:当输出某个季节时,实际上输出的是其代表的数字,通过这个数字很难猜测是代表的什么意思。
此时,我们就需要枚举类来起到作用了,拿上面的例子举例,使用枚举类 enum 关键字来代替上面的代码:
public enum SeasonEnum
{
//所有实例需要在枚举类的第一行显式列出。
SPRING,SUMMER,FALL,WINTER;
}
枚举类和普通类的对比
- 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类,而不是默认继承 Object 类,因此枚举类不能显示继承其他父类。
- 使用 enum 定义的非抽象的枚举类默认会使用 final 修饰,因此不能派生子类,即无法被继承。
- 枚举类的构造器只能使用 private 进行修饰,如果忽略了构造器的访问控制符,则默认使用 private 修饰。
- 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远无法产生实例。这些实例,系统会自动添加 public static final 进行修饰,无须程序员显式添加。
- 只能定义出 enum 的实例,无法通过 new 操作符创建 enum 的实例。
枚举类的方法
- public static<T extends Enum valueOf(ClassenumType,String name):这是一个静态方法,用于返回指定枚举类中指定名称的枚举值,name 必须与声明的枚举值全匹配,负责会报错。
- int compareTo (E o):用于与指定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例做比较。该枚举位于指定枚举之后,返回正整数,在指定枚举之前返回负整数,否则返回零。
- int ordinal():返回枚举值在枚举类的索引值,第一个位置是0。
- values():返回 enum 实例的数组,而且该数组的元素顺序和 enum 中声明的顺序是一致的。(用于遍历)
- Sting name():返回枚举常量名称,一般选择使用toSting()。
- String toSting():返回枚举常量名称,与 name 相似。
枚举类的自定义
枚举类也可以像普通类一样来定义成员变量、方法和构造器,以及实现一个或多个接口。
public enum Gender
{
//所有实例需要在枚举类的第一行显式列出。
MALE("男"),FEMALE("女"):
//定义实例变量
private final String name;
//枚举类的构造器只能使用 private 修饰
private Gender(String name)
{
this.name = neam;
}
public String getName()
{
return this.name;
}
//防止传入的值错误,进行相应的判断
public void setName(String name){
switch(this)
{
case MALE:
if(name.equals("男"))
{
this.name = name;
}
else
{
System.out.println("参数错误");
return;
}break;
case FEMALE:
if(name.equals("女"))
{
this.name = name;
}
else
{
System.out.println("参数错误");
return;
}break;
}
}
}
包含抽象方法的枚举类
并不是所有的枚举类都是用了 final 修饰,非抽象的枚举类才默认使用 final 修饰。对于一个抽象的枚举类(只要包含了抽象方法),系统默认使用 abstract 修饰,而不是使用 final 修饰。
下述代码,枚举类 Operation 让定义的四个值对 eval()提供不同的实现。
public enum Operation{
PLUS
{
public double eval(double x, double y){
return x+y;
}
},
MINUS
{
public double eval(double x, double y){
return x-y;
}
},
TIMES
{
public double eval(double x, double y){
return x*y;
}
},
DIVIDE
{
public double eval(double x, double y){
return x/y;
}
};
//为枚举类定义一个抽象方法,并且由不同的枚举值提供不同的实现
public abstract double eval(double x, double y);
}
public static void main(String[] args) {
System.out.println(Operation.PLUS.eval(3, 4));
System.out.println(Operation.MINUS.eval(3, 4));
System.out.println(Operation.TIMES.eval(3, 4));
System.out.println(Operation.DIVIDE.eval(3, 4));
}