Java的枚举类型Enum

2018-07-17  本文已影响0人  李2牛

有这么一个场景,需要枚举HTTP的请求方法,这个时候最简单的处理方法是

public class RequestTypeConstants {
    public static final int POST = 0; 
    public static final int HEAD = 1; 
    public static final int GET = 2; 
    public static final int PUT = 3; 
    public static final int UPDATE = 4; 
    public static final int DELETE = 5; 
    public static final int CONNECT = 6; 
    public static final int TRACE = 7;
}

这种定义常量的方式缺陷是

  1. 容易出错
    请求参数可能会被赋值一个毫无意义的常数,比如8
  2. 没有命名空间
    所有的HTTP请求方法必须通过类来访问
  3. 一致性差
    整型的枚举方法是编译期常量,编译完成之后,所有服务端和客户端引用的地方会将整型数值直接写入,如果这个常量枚举的类中的常量发生变化,所有的引用地方的代码都需要重新编译。
  4. 类型与实际的意义差距较大。
    调试期间直接看到数字,很难看出来具体指的是哪一个请求方法。

使用枚举类


public enum RequestTypeConstant {
    POST("POST"),
    GET("GET"),
    HEAD("HEAD"),
    PUT("PUT"),
    UPDATE("UPDATE"),
    DELETE("DELETE"),
    CONNECT("CONNECT"),
    TRACE("TRACE");

    private String string;

    RequestTypeConstant(String string) {
        this.string = string;
    }

    public String getString() {
        return string;
    }
}

使用枚举类型的优势

  1. 默认实现Comparable接口和Serializable接口
  2. 扩大switch语句的使用范围
  3. 可拓展性强,能够实现任意接口以及定义任何方法和属性

避免错误使用枚举类型

  1. enum 类型不支持 public 和 protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。
  2. 定义 enum 类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号;隔开,不能用逗号或空格。
  3. 由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 == 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。
上一篇下一篇

猜你喜欢

热点阅读