2013-05-11 16 views
5

Ho una classe enum che ha diverse costanti, e voglio aggiungere qualche valore statico FOCUSED che indica quale dei valori enum è concentrarsi ...Enum: Ho appena fatto qualcosa di indesiderato?

ho trovato un modo:

package messagesystem; 

/** 
* 
* @author Frank 
*/ 
public enum MessageType { 
    ALL, 
    GENERAL, 
    SEND, 
    RECEIVE, 
    LOG, 
    EXCEPTION, 
    DEBUG, 
    PM; 

    public final static MessageType FOCUSED = GENERAL; 

    private final String value; 

    MessageType() { 
     String firstLetter = name().substring(0, 1); 
     String otherLetters = name().substring(1, name().length()); 
     this.value = firstLetter.toUpperCase() + otherLetters.toLowerCase(); 
    } 

    @Override 
    public String toString() { 
     return value; 
    } 
} 

Tuttavia , ora mi chiedo: ho appena combinato con la classe enum? Perché non voglio che FOCUSED sia selezionabile quando si specifica il tipo di messaggio, tuttavia una classe che gestisce un enum di MessageType dovrebbe essere in grado di determinare il valore FOCUSED ... Tale che non ho bisogno di farlo in ogni classe.

Ogni pensiero è apprezzato.

MODIFICA: Si sta comportando correttamente però. Questo codice dà i risultati attesi:

this.focused = MessageType.FOCUSED.toString(); 
    System.out.println(focused); 

L'uscita è "Generale".

+0

"una classe che gestisce un enum di MessageType dovrebbe essere in grado di determinare il valore FOCUSED" - non è davvero chiaro cosa intendi con questo. Con il codice che hai dato, il valore 'FOCUSED' è * sempre *' GENERALE' –

+0

Questo è vero, l'idea è che se voglio cambiare 'FOCUSED' in un momento successivo in developemtn, che quindi ho solo bisogno di cambiarlo in un posto. Al contrario di ogni variabile che imita il valore di "FOCUSED", lo si codifica su 'GENERAL'. – skiwi

+0

Quindi vuoi davvero che sia effettivamente una costante - un alias, quasi? * Se * questo è il caso, va bene - ma questo non va di pari passo con "qualche valore statico FOCUSED che indica quale dei valori enum è focalizzato" - perché sembra un pezzo di * stato * che può variare. In parte non è chiaro perché non è ovvio che cosa significhi per un tipo di messaggio concentrarsi in primo luogo. –

risposta

3

FOCUSED è solo uno pseudonimo di GENERALE. Non apparirà nel values() dell'enumerazione e se alcuni codici client utilizzano FOCUSED, in effetti utilizzerà GENERAL, poiché entrambe le variabili si riferiscono allo stesso valore enum. Quindi no, non penso che tu abbia incasinato.

Per ridurre la confusione, è possibile che si debba rendere focused() un metodo statico, che restituisce GENERAL. Ciò eviterebbe anche la necessità di ricompilare il codice client nel caso in cui si decida che il tipo focalizzato è un altro.

+1

Voglio sottolineare l'importanza di utilizzare un metodo statico (invece di una variabile finale statica) per questo. In Java, le costanti finali statiche vengono risolte al momento * compile *. Se hai cambiato il valore della costante, qualsiasi classe già compilata continuerebbe a conservare il vecchio valore. Il consiglio di JB qui sembra sottile, ma non lo è - è molto importante! –

+0

@KevinDay Wow ok, ho dovuto leggerlo alcune volte per cogliere completamente il messaggio. Ma questo è davvero un grosso problema e potrebbe causare problemi seri. Grazie per averlo indicato, inoltre, rendendolo un metodo statico, mi assicuro anche di non poter scegliere "FOCUSED" come enume di "MessageType", che credo Netbeans mi permetta ancora di fare. – skiwi

Problemi correlati