2012-06-30 16 views
6

Jaka jest różnica między tym:EnumMap vs Enum wartości

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

a to:

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

Czy jeden łatwiejsze do odczytania? Czy jest bardziej elastyczny? Czy używa się go bardziej konwencjonalnie? Czy biegnij szybciej? Jakieś inne za i przeciw?

Odpowiedz

6

Pierwszy przypadek ma właściwość związaną z wartością enum (tylko jedna wartość).

Druga z nich ma wartość powiązaną z wyliczonym zarządzaniem zewnętrznym.

Wyobraź sobie teraz w swojej aplikacji, że chcesz uzyskać dostęp do tych wartości. Jeśli jest to stałe w drugim przypadku, znacznie trudniej byłoby odesłać mapę z dowolnego miejsca.

Drugie podejście byłoby przydatne, gdy masz różne konteksty. Na przykład: NORTH, w konkretnym kontekście NORTH powinno być 90, ale w innym kontekście potrzebna byłaby inna wartość z nim związana (kontekst może być tutaj konkretną implementacją).

+0

dlaczego własność jest "ograniczona"? Czy to jest literówka dla "związanej"? Nie cieknie, ciekawy. – Thufir

+0

@Thufir: dziękuję, to był literówka –

+0

LOL, myślałem, że było jakieś szczególne znaczenie :) Myślałem o górnych i dolnych granicach..etc – Thufir

6

Dodawanie wartości do samych stałych wyliczeniowych powoduje, że są one użyteczne bez odniesienia do innego obiektu. Jeśli przechowujesz te informacje na mapie, musisz przekazać odniesienia do mapy wokół. Jeśli są to podstawowe własności pojęć, które reprezentują stałe, prawdopodobnie najlepiej jest dodać wartości do samych stałych zamiast zapisywać je na mapie.

Użycie wartości stałych wyliczeniowych będzie szybsze niż przechowywanie ich na mapie.

+0

Dlaczego pierwsza metoda powinna być szybsza? – Geek

7

Głównym przypadkiem użycia dla EnumMap jest, gdy chcesz dołączyć dodatkowe dane do enum, których nie jesteś właścicielem. Zazwyczaj używasz biblioteki publicznej, która ma wyliczenie i musisz opisywać każdego członka swoimi danymi.

Zgodnie z ogólną zasadą, gdy dostępne są oba podejścia, użyj pierwszego.

+0

Znajduję twoje odpowiedzi wypełnione praktycznymi zastosowaniami kiedy zrobić co? Dzięki i +1. – Geek

+0

Wielkie dzięki, to najlepsze wyjaśnienie, które znalazłem. – Heaven42