2013-08-03 16 views
49

Dopo aver letto la documentazione di String java.lang.Enum.name() non sono sicuro di aver capito quando utilizzare name() e quando utilizzare toString().Qual è la differenza tra `Enum.name()` e `Enum.toString()`?

Restituisce il nome di questa costante enum, esattamente come dichiarato nella dichiarazione enum. La maggior parte dei programmatori dovrebbe usare il metodo toString preferibilmente a questo, poiché il metodo toString potrebbe restituire un nome più user-friendly. Questo metodo è progettato principalmente per l'uso in situazioni specializzate in cui la correttezza dipende dall'ottenere il nome esatto, che non varierà da una versione all'altra.

In particolare, anche se la documentazione dice di preferire toString(), proprio StandardLocation enumerazione di Java utilizza name quando avrei pensato la documentazione suggerito altrimenti.

public String getName() { return name(); } 

Inoltre Enum attrezzi toString() come,

public String toString() { 
    return name; 
} 

e non riesco a pensare a una situazione in cui un utente definito enumerazione sarebbe sovrascrivere toString() così name() e toString() sono quasi sempre esattamente la stessa.

  1. Puoi spiegare perché ignorare la documentazione e usare sempre name() è una cattiva idea?
  2. E la frase "non varierà da versione a versione". Se il nome non varierà, implicherebbe che java.lang.Enum.toString() sarebbe?
+5

Per impostazione predefinita, un 'enfor_test()' è il suo '.name()'. Tuttavia, è possibile sovrascrivere '.toString()', non '.name()'. – fge

risposta

110

La differenza principale tra name() e toString() è che name() è un final metodo, quindi non può essere sovrascritto. Il metodo toString() restituisce lo stesso valore di per impostazione predefinita, ma il valore toString() può essere sovrascritto dalle sottoclassi di Enum.

Pertanto, se è necessario il nome del campo, utilizzare name(). Se è necessaria una rappresentazione stringa del valore del campo, utilizzare toString().

Per esempio:

public enum WeekDay { 
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY; 

    public String toString() { 
     return name().charAt(0) + name().substring(1).toLowerCase(); 
    } 
} 

In questo esempio, WeekDay.MONDAY.name() restituisce "LUNEDI", e WeekDay.MONDAY.toString() restituisce "Lunedi".

WeekDay.valueOf(WeekDay.MONDAY.name()) rendimenti WeekDay.MONDAY, ma WeekDay.valueOf(WeekDay.MONDAY.toString()) genera IllegalArgumentException.

5

Utilizzare toString quando è necessario visualizzare il nome per l'utente.

Utilizzare name quando è necessario il nome per il proprio programma, ad es. per identificare e differenziare tra enumerazioni diverse.

7

Utilizzare toString() quando si desidera presentare informazioni a un utente (incluso un sviluppatore che osserva un registro). Mai fare affidamento sul tuo codice su toString() dando un valore specifico. Non provarlo mai contro una stringa specifica. Se il codice si interrompe quando qualcuno modifica correttamente il ritorno toString(), allora era già rotto.

Se avete bisogno di ottenere il nome esatto utilizzato per dichiarare la costante enum, si dovrebbe usare nome() come toString potrebbe essere stato sovrascritto

Problemi correlati