1.枚举的遍历:
public enum SpaceShip {
SCOUT,CARGO;
@Override
public String toString() {
return ordinal()+":"+name();
}
public static void main(String[] args) {
for (SpaceShip s : SpaceShip.values()) {
System.out.println(s);
}
}
}
主要知识点:
(1)创建enum时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum.
(2)Enum本身没有values()方法,是编译器在编译的时候增加的。values()是静态方法
(3)代码中的ordinal()方法是取得当前枚举的序列;
(4)name()方法是取得当前枚举名称;
(5)枚举类不能继承任何类,因为已经默认继承Enum类
2.枚举的基本用法
我在写项目中,使用enum定义状态码与状态信息,可以算做是基本用法了:在枚举类中,我定义了两个属性(如果需要,可以添加更多,比如详细描述等)index和name分别代表状态码和状态信息,它的构造方法是私有的因为不能被其他类实例化(这让我想起了effectiveJava的第3条和第4条),可以看到获取对应序列的名称是通过遍历枚举类来获取。
public enum StatusCode {
CONNECTION_TIMEOUT(2101,"连接超时"),
RQUEST_TIMEOUT(2102,"请求超时");
private int index;
private String name;
private StatusCode(int index,String name) {
this.setIndex(index);
this.setName(name);
}
public static String getName(int index) {
for (StatusCode item : values()) {
if(index==item.getIndex()) {
return item.getName();
}
}
return null;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
枚举类还能枚举方法:
public enum MailHandler {
CLASSPATH{
String getInfo() {
return System.getenv("CLASSPATH");
}
},
VERSION{
String getInfo() {
return System.getenv("java.version");
}
};
}
3.组织枚举
以如果需要管理很多的状态码,则需要将枚举归类,比如http的500-599错误是属于服务器错误,400-499是客户端错误等,一种方式是通过枚举类嵌套枚举类的方式:
public enum HTTPStatusCode {
SERVER_ERROR(ErrorStatus.ServerError.class),
CLIENT_ERROR(ErrorStatus.ClientError.class);
private ErrorStatus[] values;
public ErrorStatus[] getValues() {
return values;
}
public interface ErrorStatus{
enum ServerError implements ErrorStatus{
INTERNAL_SERVER_ERROR,BAD_GATEWAY,SERVICE_UNAVAIABLE;
}
enum ClientError implements ErrorStatus{
NOT_FOUND,BAD_REQUEST,REQUEST_TIMEOUT;
}
}
public ErrorStatus selection(int index) {
return values[index];
}
public static void main(String[] args) {
System.out.println(HTTPStatusCode.SERVER_ERROR.selection(1));
}
private HTTPStatusCode(Class<? extends ErrorStatus> kind) {
values=kind.getEnumConstants();
}
}
以上HTTPStatusCode枚举将错误状态码组织成了服务端错误以及客户端错误,使用接口来管理错误状态码。构造方法要求传入一个枚举类,然后获取此枚举类下的所有枚举,再通过调用selection方法来找到确切的枚举,对于精确描述错误码,错误信息等,可以在ServerError和ClientError中添加成员变量(可参考第2点)。
4.EnumSet和EnumMap:
(1)EnumSet:与Set相似,只是集合的类型属于Enum类型,性能与HashSet快
(2)EnumMap:跟Map操作差不多,只不过它的key必须为Enum类型
6.使用Enum实现责任链模式
使用了枚举方法,然后遍历枚举的对象来处理参数,如果能成功处理的就直接跳出来。跟设计模式上的责任链模式在写法上还是有很大区别。