19章、枚举
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实现责任链模式
使用了枚举方法,然后遍历枚举的对象来处理参数,如果能成功处理的就直接跳出来。跟设计模式上的责任链模式在写法上还是有很大区别。