2012-06-30 4 views
6

В чем разница между этим:EnumMap против Enum значения

public enum Direction { 
    NORTH(90), 
    EAST(0), 
    SOUTH(270), 
    WEST(180); 

    private final int degree_; 

    private Direction(int degree) { 
     degree_ = degree; 
    } 

    public int getDegree() { 
     return degree_; 
    } 

    public static void main(String[] args) { 
     System.out.println(NORTH.getDegree()); 
    } 
} 

и это:

public enum Direction { 
    NORTH, 
    EAST, 
    SOUTH, 
    WEST; 

    public static void main(String[] args) { 
     EnumMap<Direction, int> directionToDegree = new EnumMap<Direction, int>(Direction.class); 
     directionToDegree.put(NORTH, 90); 
     directionToDegree.put(EAST, 0); 
     directionToDegree.put(SOUTH, 270); 
     directionToDegree.put(WEST, 180); 

     System.out.println(directionToDegree.get(NORTH)); 
    } 
} 

ли один легче читать? Является ли еще более гибким? Используется ли более традиционно? Вы запускаете быстрее? Любые другие плюсы и минусы?

ответ

6

Первый случай, когда у вас есть свойство, связанное с значением enum (всего одно значение).

Второе, у вас есть значение, связанное с переходом, управляемым снаружи.

Представьте, что теперь в вашем приложении вы хотите получить доступ к этим значениям. Если это будет постоянным во втором случае, было бы гораздо сложнее отнести карту от всюду.

Второй подход был бы полезен, если у вас разные контексты. Например: NORTH, в определенном контексте NORTH должно быть 90, но в другом контексте ему потребуется другое значение, связанное с ним (контекст здесь может быть конкретной реализацией).

+0

Почему собственность «ограничена»? Это опечатка для «привязанных»? Не странно, любопытно. – Thufir

+0

@Thufir: Спасибо, это была опечатка –

+0

LOL, я думал, что есть какой-то особый смысл :) Я думал о верхних и нижних границах ... .cc – Thufir

6

Добавление значений к константам enum позволяет использовать их без ссылки на другой объект. Если вы храните эту информацию на карте, вам необходимо передать ссылки на карту. Если это фундаментальные свойства понятий, которые представляют константы, то, вероятно, лучше всего добавлять значения к самим константам, а не хранить их на карте.

Использование значений в константах перечисления будет быстрее, чем их сохранение на карте.

+0

Почему первый метод должен быть быстрее? – Geek

7

Основной вариант использования для EnumMap - это то, когда вы хотите подключить дополнительные данные к enum, которыми вы не являетесь. Как правило, вы используете публичную библиотеку с перечислением, и вам необходимо аннотировать каждого участника своими данными.

Как правило, при использовании обоих подходов используйте первый.

+0

Я нахожу ваши ответы заполненными практическими приложениями, когда делать что? Спасибо и +1. – Geek

+0

Большое спасибо, это лучшее объяснение, которое я нашел. – Heaven42

Смежные вопросы