java枚举类中字段有没有必要加final____枚举类字段 Field ‘xxx‘ may be ‘final‘

x33g5p2x  于2022-01-13 转载在 Java  
字(1.3k)|赞(0)|评价(0)|浏览(620)

java枚举类中字段有没有必要加final

今天在写一个系统统一返回码的枚举类时候,突然想到一个问题,当不小心手抖给枚举类自动生成了set方法,而恰巧在用的地方不小心用了set方法,从而修改了code值,由于枚举类是天然单例,所以造成整个环境中的code的变更,想到这儿后背有点凉。

  1. public enum CommonCodeEnum {
  2. TASK_REPEAT_START_TIMING(30000, "任务状态为计时中,不能重复开启"),
  3. TASK_REJECT_EXCEPTION(30001, "任务驳回失败"),
  4. TASK_WITHDRAW_EXCEPTION(30002, "任务撤回失败"),
  5. SYSTEM_ERROR(50000, "系统错误");
  6. private int code;
  7. private String msg;
  8. CommonCodeEnum(int code, String msg) {
  9. this.code = code;
  10. this.msg = msg;
  11. }
  12. public int getCode() {
  13. return code;
  14. }
  15. public String getMsg() {
  16. return msg;
  17. }
  18. // 这两个set方法工具自动生成,没删掉
  19. public void setCode(int code) {
  20. this.code = code;
  21. }
  22. public void setMsg(String msg) {
  23. this.msg = msg;
  24. }
  25. }

然后一个小朋友突发奇想,写了这么一句

  1. CommonCodeEnum.TASK_REPEAT_START_TIMING.setCode(100);

想在方法中动态改变,然后再使用自定义的值,但是他忽略的枚举类的单例属性,这样做会使整个环境的值变为新值,当然这样的操作在现实中基本上不会发生,当然为了做到万无一失,还是将枚举类的字段设置为final更佳,这样工具也无法生成set方法。

  1. private final int code;
  2. private final String msg;

生成set方法会提示

没有可以生成set方法的字段。
最后建议枚举类的字段加上final,养成好习惯,细节决定成败。

枚举类字段 Field ‘xxx‘ may be ‘final‘

需求

写枚举类时发现IDEA提示如下警告,看着老不舒服,那么我们要不要处理Field 'xxx' may be 'final' 呢?

分析

枚举的值都是固定的,且是全局唯一的,用 java 的术语来说就是单例的,所以我们写枚举类时一般都不会给自定义属性写Setter方法。本着单例思想,我们还是加上final

结论

最好加上 final

  1. @Getter
  2. @AllArgsConstructor
  3. public enum TypeEnum {
  4. NAME_TYPE("名称类型","NAME_TYPE"),
  5. VALUE_TYPE("值类型","VALUE_TYPE"),
  6. ;
  7. private final String name;
  8. private final String value;
  9. }

相关文章

最新文章

更多