1.为什么要使用枚举
枚举是java中特定的一种类型,在实际使用中,它可以作为一种程序规范保证数据参数安全,合理的枚举定义,将大大增强代码的可读性。
2.枚举带来的好处
user.setStatus(0);
上面的代码片段为设置用户状态,而状态0就是我们俗称的魔鬼数字,后续人员拿到这样的代码时,除了心里骂娘,代码是基本是不敢动的。有经验的程序猿会将参数提出来定义:
/** 用户状态:有效 */
private static final int USER_STATUS_EFFECTIVE = 0;
/** 用户状态:无效 */
private static final int USER_STATUS_INVALID = 1;
即:
user.setStatus(USER_STATUS_EFFECTIVE );
但往往有时候接口中可能定义用户状态作为参数,即对于接口调用方来说只知道这是一个Integer类型的参数,即使有注释,仍然可能传入任意Integer类型的数字,参数的规范此刻将发挥重要作用,接口中可以将枚举作为参数传递。
public enum StatusEnum {
STATUS_EFFECTIVE(0, "有效"), STATUS_INVALID(1, "无效");
private Integer status;
private String comment;
private StatusEnum(Integer status, String comment) {
this.status = status;
this.comment = comment;
}
public static String getComment(Integer status) {
if (status == null) return null;
for (StatusEnum statusEnum : values()) {
if (statusEnum.getStatus().intValue() == status.intValue()) {
return statusEnum.getComment();
}
}
return null;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}
3.枚举常用用法
网上说有7种用法,具体我这里就不一一列举,只说说非常基础且常用的用法。
- 枚举元素的调用
user.setStatus(StatusEnum.STATUS_EFFECTIVE.getStatus());
- 枚举元素查找
public static String getComment(Integer status) {
if (status == null) return null;
for (StatusEnum statusEnum : values()) {
if (statusEnum.getStatus().intValue() == status.intValue()) {
return statusEnum.getComment();
}
}
return null;
}
外部直接调用即可,方法可以自己定义。
String comment = StatusEnum.getComment(status);
4.什么情况下不适用
并不是所有的参数都适合建立枚举来进行规范,比如项目中常常有数据字典的维护,常常会增加或删除的字典类型就不适合通过枚举来定义。
5.写在最后
有人说枚举会增加内存,实际上凡事没有绝对的好处或坏处,只是说适用不适用。全是魔鬼数字代码,基本过段时间自己都不知道是什么意思了,更别指望别人来读懂你的代码。况且简单常用的编码风格,也是绝大部分程序猿能够欣然接受的,不是么?