今天在写一个系统统一返回码的枚举类时候,突然想到一个问题,当不小心手抖给枚举类自动生成了set方法,而恰巧在用的地方不小心用了set方法,从而修改了code值,由于枚举类是天然单例,所以造成整个环境中的code的变更,想到这儿后背有点凉。
public enum CommonCodeEnum {
TASK_REPEAT_START_TIMING(30000, "任务状态为计时中,不能重复开启"),
TASK_REJECT_EXCEPTION(30001, "任务驳回失败"),
TASK_WITHDRAW_EXCEPTION(30002, "任务撤回失败"),
SYSTEM_ERROR(50000, "系统错误");
private int code;
private String msg;
CommonCodeEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
// 这两个set方法工具自动生成,没删掉
public void setCode(int code) {
this.code = code;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
然后一个小朋友突发奇想,写了这么一句
CommonCodeEnum.TASK_REPEAT_START_TIMING.setCode(100);
想在方法中动态改变,然后再使用自定义的值,但是他忽略的枚举类的单例属性,这样做会使整个环境的值变为新值,当然这样的操作在现实中基本上不会发生,当然为了做到万无一失,还是将枚举类的字段设置为final更佳,这样工具也无法生成set方法。
private final int code;
private final String msg;
生成set方法会提示
没有可以生成set方法的字段。
最后建议枚举类的字段加上final,养成好习惯,细节决定成败。
写枚举类时发现IDEA提示如下警告,看着老不舒服,那么我们要不要处理Field 'xxx' may be 'final'
呢?
枚举的值都是固定的,且是全局唯一的,用 java
的术语来说就是单例的,所以我们写枚举类时一般都不会给自定义属性写Setter
方法。本着单例思想,我们还是加上final
。
最好加上 final
@Getter
@AllArgsConstructor
public enum TypeEnum {
NAME_TYPE("名称类型","NAME_TYPE"),
VALUE_TYPE("值类型","VALUE_TYPE"),
;
private final String name;
private final String value;
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_43842093/article/details/122443490
内容来源于网络,如有侵权,请联系作者删除!