Лучшая практика для заполнения карты констант, используемой в повторно используемом методе Java

#java #hashmap

#java #hashmap

Вопрос:

Я использую многоразовый метод для сопоставления двух кодов, когда мы получаем ‘a’, мы хотим использовать ’01’ в нашем коде. Это статический метод, поэтому правильно ли, что он создается только один раз, и мы повторно используем метод, или это плохая практика, и она излишне обрабатывается каждый раз, когда мы вызываем этот метод? это хорошая практика или я должен создавать эту карту где-то еще и просто использовать метод для возврата значений из нее?

     private static String mapStatus(String duckStatus){

       
        Map<String, String> statusMap = new HashMap<String,String>();
        statusMap.put("a","01");
        statusMap.put("b","02");
        statusMap.put("c","03");

        if (!statusMap.containsKey(duckStatus)){
            throw new NullPointerException("Invalid Code does not map to status code");
        }
        return statusMap.get(duckStatus);
    }
    
  

Комментарии:

1. Вероятно, для обсуждения, но public enum DuckStatus{} может быть хорошим выбором для постоянного преобразования? Если только эти значения на самом деле не поступают откуда-то динамично.

2. Интересно, да, теперь, когда вы говорите, что перечисление, вероятно, имело бы больше смысла

3. Если значения постоянны, и вы хотите сохранить такие вещи, как DuckStatus status; и использовать любое из значений. Опять же, ваш пример на самом деле не объяснил, КАК он использовался, только то, что вам было нужно, следовательно, «для обсуждения»

4. Итак, есть 2 разных приложения, которые используют разные коды для статуса, они оба являются константами, когда одно приложение вызывает это приложение, мы хотим сопоставить коды из приложения 1, которые будут использоваться здесь.

5. Оба приложения используют общий код для преобразования статуса ‘? Я бы все равно, вероятно, сделал это, чтобы присвоить каждому статусу имя и два возможных значения. Каждое приложение может определить, какое из двух значений им нужно проанализировать / отправить.

Ответ №1:

Согласно комментариям, enum может быть хорошим выбором, но опять же, как уже упоминалось @kendavidson, это спорно. С точки зрения производительности я не вижу большой разницы между enum и HashMap здесь, но, на мой взгляд, HashMap это будет более уместно и обеспечит лучшую читаемость. Единственное отличие, которое я предлагаю в написанном вами коде, заключается в том, чтобы сделать HashMap статически заполненным, чтобы HashMap избежать времени накопления каждый раз, когда вы хотите выполнить поиск statusMap всякий раз, когда выполняется вызов mapStatus метода. Измененный код будет выглядеть следующим образом:

 public class Test {
    private static final Map<String, String> STATUS_MAP = new HashMap<>();
    static {
        // Mapping the status values in Duck Creek to the Values used here
        STATUS_MAP.put("a", "01");
        STATUS_MAP.put("b", "02");
        STATUS_MAP.put("c", "03");
    }

    private static String mapStatus(String duckStatus) {
        if (!STATUS_MAP.containsKey(duckStatus)) {
            throw new IllegalArgumentException("Invalid code "   duckStatus   " does not map to status code");
        }
        return STATUS_MAP.get(duckStatus);
    }
}
  

Примечание:

  1. Не уверен, что вы хотели проверить duckStatus в duckCreekToEDMStatusMapper или STATUS_MAP , я использую STATUS_MAP
  2. Вместо того, чтобы NullPointerException лучше использовать IllegalArgumentException , как это уместно здесь.

Комментарии:

1. Да, предполагалось использовать карту состояния, которая была проблемой копирования и вставки, был вопрос рефакторинга для stack overflow, чтобы не использовать мои фактические имена переменных и забыл изменить это. Отличный ответ именно то, что я искал!