1、什么是枚举类、枚举类的使用场景
1、枚举类是一组有限常量的集合。
2、当类的对象是有限个、确定的,可以将这个类设定为枚举类
3、当需要定义一组常量时,使用枚举类。
4、可以用枚举类来表示状态。
2、如何定义枚举类
- java5以前的定义
public class Condition {
//描述枚举类
private final String desc;
//枚举类的构造器总是私有的,因为枚举类实例是常量
//常量必须被赋值
private Condition(String desc){
this.desc = desc;
}
//定义枚举类常量
public static final Condition fine = new Condition("fine");
public static final Condition good = new Condition("good");
public static final Condition bad = new Condition("bad");
@Override
public String toString() {
return "Condition{" +
"desc='" + desc + '\'' +
'}';
}
}
==============================
System.out.println(Condition.bad);
2、java5以后进行了优化,只需要用enum关键字,就可以将一个类声明为枚举类
public enum Condition {
fine ("fine"),
good("good"),
bad ("bad");
private final String desc;
private Condition(String desc){
this.desc = desc;
}
@Override
public String toString() {
return "Condition{" +
"desc='" + desc + '\'' +
'}';
}
}
3、enum定义枚举类的细节
1、用enum关键字定义枚举常量时,枚举常量必须放在类的最前面定义
public enum Condition {
fine ("fine"),
good("good"),
bad ("bad");
}
2、定义枚举常量时,直接写枚举常量名,默认枚举常量修饰符为public static final
枚举常量类型为 枚举类;将描述枚举常量的变量值紧跟枚举常量后面,等价于向私有构造器传入。
public enum Condition {
fine ("fine"),
good("good"),
bad ("bad");
}
每一个枚举常量之间用 “ , ”隔开,最后用 “;”
3、每一个枚举类的构造器总是私有的,因为枚举类实例是常量,不需要被改变;
如果一个枚举类的构造器是public或者protected,会出现语法错误
4、每一个具体枚举类都有一个抽象父类:
public abstract class Enum<E extends Enum<E>>
5、枚举类可以直接使用 == 来判断两个枚举类是否相同
6、构造枚举类时的构造器调用链
父类Enum的构造器------->实现子类的构造器
PS: 父类Enum的构造器
Enum的构造器只有一个有参构造器
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
这个构造器中有两个参数,name、ordinal;
name是枚举常量名,ordinal是枚举常量声明时的位置
4、枚举类的方法
所有枚举类继承于抽象父类 java.lang.Enum,Enum中定义了如下方法
接下来重点讲几个方法:
1、String toString
Enum中的用于返回枚举常量名。
2、静态方法values
Enum中返回包含全部枚举变量的数组
Condition[] values = Condition.values();
System.out.println(Arrays.toString(values));
=========================================
输出枚举常量名:[fine, good, bad]
3、int ordinal
方法枚举常量在enum声明中的位置,位置从0开始计数
int ordinal = Condition.bad.ordinal();
System.out.println(ordinal);//输出 2
4、Static Enum valueOf
Condition condition = Condition.valueOf("bad");
Condition condition1 = Condition.valueOf(Condition.class, "bad");
传入枚举常量名或者指定枚举类型与枚举常量名,返回一个枚举常量。
5、int compareTo()
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;//ordinal指声明中的位置
}
用于比较传入的枚举常量与枚举常量的大小,比较的依据是在enum中声明的位置。
如果枚举常量出现在传入的常量之前,返回负数;相等,返回0;在传入常量后,返回正数;
返回值是两者位置之差,注意:上面说过,枚举类的位置从0开始
定义的位置:
fine,
good,
bad;
@Test
public void aVoid(){
int i = Condition.bad.compareTo(Condition.fine);
System.out.println(i);//输出 2
}