【问题标题】:How to handle thousands of error message constant in java?如何处理java中成千上万的错误消息常量?
【发布时间】:2026-02-09 03:50:01
【问题描述】:

我的应用正在向其他方的 API 发送请求。 每一方都有我需要处理的不同返回码。 结果是我需要处理来自各方的数千个不同的返回码。

我正在考虑创建一个特定的类来保持不变来处理所有这些。 会是这样的:

public static final Map<String, String>  RETURN_CODE_MAP = new HashMap<String, String>(){
    {
        // these mapping will be thousands of line
        put("BANK_A_000","SUCCESS");
        put("BANK_A_001","FAILED");
        put("BANK_A_002","UNKNOWN");
        put("BANK_B_SU","SUCCESS");
        put("BANK_B_FA","FAILED");
        put("BANK_B_UN","UNKNOWN");
        put("BANK_C_00077","SUCCESS");
        put("BANK_C_00088","FAILED");
        put("BANK_C_00099","UNKNOWN");
        put("E-COMMERCE_A_000","SUCCESS");
        put("E-COMMERCE_A_001","FAILED");
        put("E-COMMERCE_A_002","UNKNOWN");
        put("E-COMMERCE_B_000SU","SUCCESS");
        put("E-COMMERCE_B_000FA","FAILED");
        put("E-COMMERCE_B_000UN","UNKNOWN");
        put("E-COMMERCE_C_00077","SUCCESS");
        put("E-COMMERCE_C_00088","FAILED");
        put("E-COMMERCE_C_00099","UNKNOWN");
    }
};

返回代码列表将有数千个。 会不会有性能问题? 你们能告诉我处理这种情况的正确方法吗?谢谢大家

【问题讨论】:

  • 我会将这些值存储在属性文件中,并在启动时读取它以加载地图。或者,使用数据库(如果它们变化很大)。如果您在常量中硬编码,这将是一场噩梦。
  • 附带说明,你不应该使用双括号初始化器。如果您使用 DBI 输入 100 个值,那么将创建 100 个匿名类。很多花哨的语法都被无意中听到了。
  • 这听起来不正确,@HarshalParekh。您有该声明的来源吗?
  • 再一次,你误读了。这个人说他们在整个代码库中有 1000 个这样的初始化程序。这和你说的不一样。您说“如果您使用 DBI 输入 100 个值”,这是不对的。它是每个初始化程序一个匿名类,而不是每个行或每个方法调用。

标签: java response constants


【解决方案1】:

我建议每方使用一个 Enum。它使您可以比地图更容易地存储附加信息,并且如果使用得当,可以节省一些可能被字符串比较浪费的性能(例如map.get(x).equals("SUCCESS"))。

这可能看起来像这样:

ResponseStatus.java

public enum ResponseStatus {
    SUCCESS,
    FAILED,
    UNKNOWN;
}

BankA.java

import static my.pkg.ResponseStatus;


public enum BankA {

    C_000("000", SUCCESS),
    C_001("001", FAILED),
    C_002("002", UNKNOWN),
    // And so on ...

    private final ResponseStatus status;
    private final int hashCode;

    private BankA(String code, ResponseStatus status) {
        this.status = status;
        this.hashCode = code.hashCode();
    }

    public ResponseStatus getStatus() {
        return this.status;
    }

    public static BankA byStaus(String status) {
        BankA[] values = values();
        int hash = status.hashCode();
        for (int n = 0; n < values.length; n++) {
            BankA value = values[n];
            if (value.hashCode == hash) return value;
        }

        return null; // No entry found by that code
    }

}

请注意,在byStatus 中,我比较的是哈希码而不是字符串本身,这比比较数百个字符串要快。

最后,您的最终检查可能如下所示:

BankA status = BankA.byStatus(response);

if (status != null && status.getStatus() == ResponseStatus.SUCCESS) {
    // Do something
}

【讨论】:

  • 非常感谢!已添加到可能的解决方案列表中!