枚举类型
枚举类型是指有由一组固定的常量组成合法值的类型,比较适合有限且固定的类型,比如衣服尺寸(S、M、L)、季节等。
一个简单的枚举类型如下所示:
public enum Size{
SMALL,
MEDIUM,
LARGE,
EXTRA_LARGE
}
这个枚举类型实际上只有四个实例,因此不可能构造新的对象。同时对于枚举类型的比较,可以直接使用==而不需要使用equals方法。
当然,枚举类型可以有更加复杂的行为,如果有需要可以为枚举类型添加构造器、方法以及字段。
public enum Size{
SMALL("S"),
MEDIUM("M"),
LARGE("L"),
EXTRA_LARGE("XL");
private String s;
Size(String s) {
this.s = s;
}
public String getS() {
return this.s;
}
}
其中,构造方法只在构造枚举常量时调用,因此该构造方法默认是私有的,如果声明为public会出现语法错误,这里省略不写private。
那么如何对枚举类型进行访问呢?请看下面的例子
public class Demo {
public static void main(String[] args) {
String input = "SMALL";
// 对于小写的输入可以使用input.toUpperCase()方法将字符串转为大写
Size size = Enum.valueOf(Size.class, input);
System.out.println("size = "+size);
System.out.println("s = "+size.getS());
if (size==Size.SMALL) {
System.out.println("The size is SMALL");
}
// 使用values()方法获得每一个枚举类型数组
Size[] sizes = Size.values();
for (Size s : sizes) {
System.out.println(s+"--"+s.getS());
}
}
}
所有的枚举类型都是继承自Enum,因此可以使用Enum的一些有用的方法。
java.lang.Enum<E>
方法名 | 解释 |
---|---|
static Enum valueOf(Class enumClass, String name) | 返回给定类型中有指定类型的枚举常量 |
public String toString() | 返回枚举常量名 |
public final int ordinal() | 返回枚举类型在enum声明中的位置,从0开始 |
public final int compareTo(E o) | 枚举常量出现在o之前返回一个负整数;如果this==other,则返回0;否则,返回一个正整数 |
枚举类使用注意事项
这一部分参考Effective Java,详细的解释可以参考该书
使用实例域代替序数
我们在使用枚举的时候可能面对这样一种场景:我们想要知道这个枚举类型的序数或者说知道这个枚举类型是编号第几个(比如SMALL、MEDIUM、LARGE、EXTRA_LARGE分别编号1、2、3、4)
不建议的写法:
public enum Size {
SMALL,
MEDIUM,
LARGE,
EXTRA_LARGE;
public int number() {
return ordinal()+1;
}
}
该种方法可以实现功能。但是如果面对常量重新排序,number()方法就会出错。
推荐写法:
public enum Size {
SMALL(1),
MEDIUM(2),
LARGE(3),
EXTRA_LARGE(4);
private final int numberOfSize;
Size(int size) {
this.numberOfSize = size;
}
public int number() {
return this.numberOfSize;
}
}
参考:
1、Java核心技术I
2、Effective Java