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

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

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;
}

相关文章

最新文章

更多