You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java注解中如何使用枚举字段传递错误码?

问题解决:注解中使用枚举错误码避免硬编码

问题原因

Java注解的属性值必须是编译时常量表达式,ErrorMessages.NO_USER.getCode()是方法调用,即便枚举的code是final修饰的成员变量,方法调用也不属于编译时常量范畴,因此编译器会抛出Attribute value must be constant错误。

可行解决方案

在枚举类中定义对应的静态编译时常量,让枚举实例引用这些常量,同时注解直接使用常量值,既保留枚举的结构,又避免重复硬编码:

修改后的枚举类

public enum ErrorMessages {
    NO_USER(NO_USER_CODE, "User not found"),
    UNKNOWN_MODULE(UNKNOWN_MODULE_CODE, "Module unknown"),
    INCORRECT_DATE(INCORRECT_DATE_CODE, "Incorrect date");

    // 定义编译时常量,供注解直接引用
    public static final int NO_USER_CODE = 1004;
    public static final int UNKNOWN_MODULE_CODE = 1006;
    public static final int INCORRECT_DATE_CODE = 1009;

    public final int code;
    private final String messageEng;

    ErrorMessages(int code, String messageEng) {
        this.code = code;
        this.messageEng = messageEng;
    }

    public int getCode() {
        return code;
    }

    public String getMessageEng() {
        return messageEng;
    }
}

修改后的注解用法

@JsonRpcMethod("MyMethod")
@JsonRpcErrors(@JsonRpcError(exception = UserNotFoundException.class, code = ErrorMessages.NO_USER_CODE))
boolean myMethod(
    @JsonRpcParam("userId") Integer userId, @JsonRpcParam("apiKey") String apiKey)
    throws UserNotFoundException;

方案优势

  • 无需将枚举改为接口,保留原有枚举的封装性和语义化
  • 错误码仅在枚举的静态常量处定义一次,避免重复硬编码导致的不一致问题
  • 完全符合Java注解对编译时常量的要求,编译通过无报错

内容的提问来源于stack exchange,提问作者r2r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:17:10