枚举是一种特殊的数据,它的取值是有限的,比如一年四季、一周七天。
枚举类型实际上会被 Java 编译器转换为一个对应的类,这个类继承了 java.lang.Enum 类,枚举是 final 的,不能被继承。
枚举类型本质上也是类,由于编译器自动做了很多事情,枚举的语法更为简洁,更为安全,一个枚举类型的变量,它的值要么为 null,要么为枚举值之一,不可能为其他值,但使用整型变量,它的值就没有办法强制,值可能就是无效的。
枚举定义
/**
* 枚举使用 enum 这个关键字来定义
*/
public enum Size {
// 值一般是大写的字母,多个值之间以逗号分隔
// 枚举值的定义需要放在最上面,枚举值写完之后,要以分号(; )结尾,然后才能写其他代码
SMALL(1, "S", "小号"),
MEDIUM(2, "M", "中号"),
LARGE(3, "L", "大号");
private int id;
private String abbr;
private String title;
private Size(int id, String abbr, String title) {
this.id = id;
this.abbr = abbr;
this.title = title;
}
public int getId() {
return id;
}
public String getAbbr() {
return abbr;
}
public String getTitle() {
return title;
}
public static Size fromAbbr(String abbr){
for (Size size : Size.values()){
if(size.getAbbr().equals(abbr)){
return size;
}
}
return null;
}
}
枚举可以包含抽象方法,如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。
enum Color {
RED{
public String getColor(){ // 枚举对象实现抽象方法
return "红色";
}
},
GREEN{
public String getColor(){ // 枚举对象实现抽象方法
return "绿色";
}
},
BLUE{
public String getColor(){ // 枚举对象实现抽象方法
return "蓝色";
}
};
public abstract String getColor(); // 定义抽象方法
}
public class Test{
public static void main(String[] args) {
for (Color c:Color.values()){
System.out.print(c.getColor() + "、");
}
}
}
使用枚举
Size size = Size.SMALL;
枚举变量可以使用 equals 和 == 进行比较,结果是一样的。
枚举常用方法
public class TestUtil {
public static void main(String[] args) {
enumTest();
onChose(Size.SMALL);
enumTestTwo();
}
public static void enumTest(){
Size sSize = Size.SMALL;
Size mSize = Size.MEDIUM;
Size lSize = Size.LARGE;
System.out.println(mSize.toString()); // toString 方法返回其字面值 MEDIUM
System.out.println(mSize.name()); // name()方法,返回值与toString()一样 MEDIUM
System.out.println(mSize.ordinal()); // ordinal()表示枚举值在声明时的顺序,从0开始
System.out.println(sSize.compareTo(lSize)); // 其实就是比较ordinal的大小
// 枚举变量可以使用equals和==进行比较,结果是一样的
System.out.println(Size.MEDIUM==mSize);
System.out.println(Size.MEDIUM.equals(mSize));
System.out.println(Size.valueOf("LARGE").name()); // valueOf 返回字符串对应的枚举值
for (Size size : Size.values()) { // values 返回一个包括所有枚举值的数组
}
}
public static void onChose(Size size){
// 在switch语句内部,枚举值不能带枚举类型前缀,枚举值会被转换为其对应的 ordinal 值
switch (size) {
case SMALL:
System.out.println("chose small");
break;
case MEDIUM:
System.out.println("chose medium");
case LARGE:
System.out.println("chose large");
}
}
public static void enumTestTwo(){
Size s = Size.SMALL;
Size m = Size.MEDIUM;
Size l = Size.fromAbbr("L");
System.out.println(s.getId());
System.out.println(m.getAbbr());
System.out.println(l.getTitle());
}
}
参考:《Java 编程的逻辑》 马俊昌