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;
}
这种定义常量的方式缺陷是
- 容易出错
请求参数可能会被赋值一个毫无意义的常数,比如8 - 没有命名空间
所有的HTTP请求方法必须通过类来访问 - 一致性差
整型的枚举方法是编译期常量,编译完成之后,所有服务端和客户端引用的地方会将整型数值直接写入,如果这个常量枚举的类中的常量发生变化,所有的引用地方的代码都需要重新编译。 - 类型与实际的意义差距较大。
调试期间直接看到数字,很难看出来具体指的是哪一个请求方法。
使用枚举类
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;
}
}
使用枚举类型的优势
- 默认实现Comparable接口和Serializable接口
- 扩大switch语句的使用范围
- 可拓展性强,能够实现任意接口以及定义任何方法和属性
避免错误使用枚举类型
- enum 类型不支持 public 和 protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。
- 定义 enum 类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号
;
隔开,不能用逗号或空格。 - 由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号
==
操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。