2012-06-30 19 views
6

Qual è la differenza tra questo:EnumMap vs. Enum valori

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

e questo:

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

È uno più facile da leggere? È uno più flessibile? Uno è usato più convenzionalmente? Si corre più veloce? Qualche altro pro e contro?

risposta

6

Nel primo caso si ha una proprietà legata al valore enum (un solo valore).

Il secondo si ha il valore associato all'enum gestito all'esterno.

Immaginate ora nella vostra applicazione che volete accedere a questi valori. Se questo è costante nel secondo caso, sarebbe molto più complicato riferirsi alla mappa da ogni parte.

Il secondo approccio sarebbe utile quando si hanno diversi contesti. Ad esempio: NORTH, in un contesto specifico NORTH dovrebbe essere 90, ma in un altro contesto sarebbe richiesto un altro valore associato ad esso (un contesto qui potrebbe essere un'implementazione specifica).

+0

perché la proprietà è "limitata"? È un errore di battitura per "incollato"? Niente pignoli, curioso. – Thufir

+0

@Thufir: grazie, è stato un errore di battitura –

+0

LOL, ho pensato che ci fosse un significato speciale :) Stavo pensando ai limiti superiore e inferiore..etc – Thufir

6

L'aggiunta di valori alle costanti enum li rende utilizzabili senza riferimento a un altro oggetto. Se memorizzi queste informazioni in una mappa, devi passare i riferimenti alla mappa. Se queste sono proprietà fondamentali delle nozioni rappresentate dalle costanti, è probabilmente meglio aggiungere i valori alle costanti stesse invece di memorizzarle in una mappa.

L'utilizzo dei valori sulle costanti di enumerazione sarà più rapido di memorizzarli in una mappa.

+0

Perché il primo metodo dovrebbe essere più veloce? – Geek

7

Il caso d'uso principale per lo EnumMap è quando si desidera allegare dati aggiuntivi a un enum di proprietà dell'utente. In genere si utilizza una libreria pubblica con enum ed è necessario annotare ogni membro con i propri dati.

Come regola generale, ogni volta che entrambi gli approcci sono disponibili, utilizzare il primo.

+0

Trovo le tue risposte piene di applicazioni pratiche su quando fare cosa? Grazie e +1. – Geek

+0

Grazie mille è la migliore spiegazione che ho trovato. – Heaven42