2013-09-08 5 views
0

Этот вопрос касается определенной плохой практики программирования. Я ищу хорошую статью, которая объясняет это и почему это плохо. К сожалению, я не знаю ни имени, ни жаргона для этой практики. Итак, я попытаюсь описать его и попрошу рассказать мне, как это называется, и, возможно, ссылаться на хорошую статью по этому вопросу.Плохая практика относительно java enum

Предположим, что мы имеем некоторое перечисление:

public enum Day 
{ 
    SUNDAY, MONDAY, ... 
} 

Далее, предположим, что серверный программист присоединяет числовой идентификатор для каждого дня. Правильная вещь, конечно же, состоит в том, чтобы сопоставить каждый Day с Integer с использованием EnumMap, который определен и используется только в пределах серверного кода. Вместо этого он портит общий код и добавляет getId() метод:

public enum Day 
{ 
    SUNDAY {public int getId() {return 100;}}, 
    MONDAY {public int getId() {return 101;}}, 
    ...; 

    public abstract int getId(); 
} 

Далее, GUI программист хочет присоединить строку каждый день, поэтому он добавляет свой собственный материал:

public enum Day 
{ 
    SUNDAY { 
     public int getId() {return 100;} 
     public String getName() {return "sunday";} 
    }, 
    MONDAY { 
     public int getId() {return 101;}; 
     public String getName() {return monday";} 
    }, 
    ...; 

    public abstract int getId(); 
    public abstract String getName(); 
} 

Вы понимаете ...

Как вы это называете? Знаете ли вы какую-нибудь хорошую статью об этом?

+0

Правильный способ: «Enum.ordinal()» вместо EnumMap. –

+0

Я не знаю, есть ли для этого специальное имя. Непоследовательный, вероятно, лучший термин. Если вы используете метод enum и следуете парадигме конструктора, вы гарантируете, что результат будет там. – cgp

+1

@VeriTi: прости меня. Вы читали, что [Enum API] (http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html) должен сказать об использовании 'ordinal()'? Они тоже просят отличиться. –

ответ

7

Я бы не понял, почему это плохо, кроме того, что это более подробно, чем должно быть. Вы можете заменить это:

public enum Day { 
    SUNDAY(0, "sunday"), 
    MONDAY(1, "monday"), 
    TUESDAY(2, "tuesday"), 
    WEDNESDAY(3, "wednesday"), 
    THURSDAY(4, "thursday"), 
    FRIDAY(5, "friday"), 
    SATURDAY(6, "saturday"); 

    private final int mIndex; 
    private final String mName; 

    Day (int index, String name) { 
     mIndex = index; 
     mName = name; 
    } 

    public int getIndex() { 
     return mIndex; 
    } 

    public String getName() { 
     return mName; 
    } 

    public static Day fromIndex (int index) { 
     if (index < 0 || index > 6) { 
      throw new IllegalArgumentException(index + " is not a valid day index."); 
     } 

     Day result = null; 

     for (Day day : values()) { 
      if (day.mIndex == index) { 
       result = day; 
       break; 
      } 
     } 

     return result; 
    } 
} 

Я использую этот шаблон часто для corralling данных из веб-службы, который возвращается как целое число. Это, конечно, лучше, чем использование Day.ordinal(), так как тогда порядок определения в вашем перечислении становится важным и требует, чтобы индексы были последовательными.

+0

Вы можете использовать массив для поиска 'fromIndex', даже если вы не хотите использовать' values ​​() 'непосредственно, вы можете кэшировать повторно построенный' Day [] ' –

+0

Примечание:' getIndex() '==' ordinal() ', поскольку они возвратят одно и то же. Кроме того, для вашего 'fromIndex (int)', почему бы просто не использовать 'Day.values ​​() [index]'? –

+3

@PeterLawrey Я спустился по этой дороге в какой-то момент, затем прошел через и провел некоторые тесты производительности и понял, что разница была смехотворно незначительной, поэтому для ясности я просто использую 'values ​​()' сейчас. – kcoppock