帅气的毛毛侠

导航

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实现责任链模式

  使用了枚举方法,然后遍历枚举的对象来处理参数,如果能成功处理的就直接跳出来。跟设计模式上的责任链模式在写法上还是有很大区别。

 

posted on 2017-11-26 21:05  帅气的毛毛侠  阅读(126)  评论(0编辑  收藏  举报