Как обрабатывать тысячи сообщений об ошибках констант в java? - PullRequest
0 голосов
/ 29 апреля 2020

Мое приложение отправляет запрос в API от некоторых других сторон. У каждой партии есть разные коды возврата, которые мне нужно обработать. В результате мне нужно обработать тысячи различных кодов возврата от этих сторон.

Я думаю о создании определенного c класса, который будет поддерживать константу для обработки всех из них. Это будет выглядеть так:

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

В списке кодов возврата будут тысячи из них. Будет ли проблема с производительностью? Ребята, не могли бы вы сказать мне, как правильно обращаться с таким делом? Спасибо всем

1 Ответ

3 голосов
/ 29 апреля 2020

Я бы предложил использовать 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 I Я сравниваю коды ha sh вместо самих строк, что быстрее, чем сравнение сотен строк.

В конце ваша окончательная проверка может выглядеть так:

BankA status = BankA.byStatus(response);

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