枚举
一些程序在运行时,他需要的数据不能是任意的,而必须是一定范围内的值,JDK5以前采用自定义类来解决,JDK5以后可以直接采用枚举解决。
在JDK5之后,使用enum关键字定义一种新的类型,称为枚举类型。
Enum类和enum关键字
使用enum关键字定义的枚举类,实际上就相当于定义了一个类,此类继承了Enum类而已。
无参
class Grade{
private Grade(){}
public satic final Grade A = new Grade();
public satic final Grade B = new Grade();
}
//相当于
enum Grade{
A,B;
}
带参
import org.junit.Test;
public class Demo {
@Test
public void test() {
print(Grade.B);
}
public void print(Grade g) {
String value = g.getValue();
System.out.println(value);
}
}
enum Grade {
A("100-90"), B("89-80");
private String value;
private Grade(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
}
带抽象方法
import org.junit.Test;
public class Demo {
@Test
public void test() {
print(Grade.B);
}
public void print(Grade g) {
String value = g.localeValue();
System.out.println(value);
}
}
enum Grade {
A("100-90") {
@Override
public String localeValue() {
return "优";
}
},
B("89-80") {
@Override
public String localeValue() {
return "良";
}
};
private String value;
private Grade(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
public abstract String localeValue();
}
注意事项
定义枚举类要用关键字enum;
所有枚举类都是Enum的子类;
枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略;
枚举类可以有构造器,但必须是private的,它默认的也是private的。枚举项的用法比较特殊:枚举(“”);
枚举类也可以有抽象方法,但是枚举项必须重写该方法。
Enum类中定义了如下的方法
public class GeadeTest {
public static void main(String[] args) {
//创建枚举对象
Grade gradeA = Grade.A;
Grade gradeB = Grade.B;
// int compareTo(E o):自然排序,返回两个枚举项之间相差几位
System.out.println(gradeA.compareTo(gradeA));
System.out.println(gradeA.compareTo(gradeB));
System.out.println(gradeB.compareTo(gradeA));
System.out.println("---------------");
// String name():枚举的名字
System.out.println(gradeA.name());
System.out.println(gradeB.name());
System.out.println("---------------");
// int ordinal():枚举的序号
System.out.println(gradeA.ordinal());
System.out.println(gradeB.ordinal());
System.out.println("---------------");
// String toString()
System.out.println(gradeA.toString());
System.out.println(gradeB.toString());
System.out.println("---------------");
// <T> T valueOf(Class<T> type,String name):单个枚举对象
Grade grade = Enum.valueOf(Grade.class, "A");
System.out.println(grade.getValue());
System.out.println("----------------");
// values():此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便
Grade[] grades =Grade.values();
for (Grade g : grades) {
System.out.println(g);
System.out.println(g.getValue());
}
}
}
枚举:只能在本类中创建实例
REGISTER_SUCCEED//注册成功
REGISTER_FAILED//注册失败