java枚举类中字段有没有必要加final
今天在写一个系统统一返回码的枚举类时候,突然想到一个问题,当不小心手抖给枚举类自动生成了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,养成好习惯,细节决定成败。
枚举类字段 Field ‘xxx‘ may be ‘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;
}