2014-09-24 35 views
15

Ho spesso la situazione in cui ho bisogno di una variabile per una classe che potrebbe essere rappresentato come semplice tipo enum, ad esempio:Overumill enum di Java?

private enum PageOrder {DOWN_THEN_OVER, OVER_THEN_DOWN}; 

Se un dichiarare il tipo enum all'interno della classe che contiene la variabile poi ho usare il nome qualificato MyClass.PageOrder che non è comodo. Ma se creo una nuova classe, ho una classe solo per una semplice dichiarazione enum, che per me sembra esagerata.

Per tale motivo, utilizzo spesso numeri interi anziché di tipo enum.

Eventuali commenti/suggerimenti su questo argomento?

+26

Mai "correggere" la soluzione corretta su una errata solo per salvare la digitazione. – biziclop

+1

"* Ma se creo una nuova classe ho una classe solo per una semplice dichiarazione enum, che mi sembra esagerata *" - dov'è l'overkill? Un enum privato è anche una classe (con un proprio file .class) - ha solo una visibilità diversa. –

+5

Un enum nel proprio file può sembrare eccessivo, ma non lo è. È completamente appropriato ed è un buon design. Aggiungi qualche utile javadoc alla classe enum e ad ognuna delle sue costanti, e scoprirai che il file sorgente non sembrerà quasi scarso. Ci sono usi legittimi per le classi interne, ma fare qualcosa di una classe interiore semplicemente perché il proprio file sarebbe "troppo pesante" non è una buona ragione. – VGR

risposta

34

Si può fare

import static yourpkg.MyClass.PageOrder; 

Questo funziona sempre dal inner enums are always static. Nota che funziona anche nel file che definisce la classe MyClass.

+4

E puoi configurare Eclipse per inserire automaticamente le importazioni statiche. – biziclop

+2

Sì. Come spiegato [qui] (http: // StackOverflow.com/domande/288.861/eclipse-ottimizzare-importazioni-to-statici importazioni-include-). – aioobe

+1

Gli enumerati evitano ambiguità o semplicemente codice criptico. 'renderPage (1)' non è così informativo come 'renderPage (OVER_THEN_DOWN)'. – sfdcfox

21

Per tale motivo, utilizzo spesso numeri interi anziché di tipo enum.

Si prega di non farlo.

Spesso è possibile scegliere un nome per la classe padre e lo enum che aiuta effettivamente la chiarezza del codice.

class Page { 
    enum Order { 
     DOWN_THEN_OVER, OVER_THEN_DOWN; 
    } 
} 

// Accessing: A little verbose but clear and efficient. 
Page.Order order = Page.Order.DOWN_THEN_OVER; 

È inoltre possibile static import ogni enum si utilizza, ma io preferisco il livello di dettaglio di cui sopra.

import static com.oldcurmudgeon.test.Test.Order.DOWN_THEN_OVER; 
import static com.oldcurmudgeon.test.Test.Order.OVER_THEN_DOWN; 

public class Test { 

    enum Order { 

     DOWN_THEN_OVER, OVER_THEN_DOWN; 
    } 

    public void test() { 
     Order pageOrder = DOWN_THEN_OVER; 
    } 

} 

Ovviamente non si può prendere questo approccio se l'enum è private.

+1

L'alternativa a enum è usare 'public static final int DOWN_THEN_OVER = 0; public static final int OVER_THEN_DOWN = 1; 'e mi sembra che entrambi siano ugualmente leggibili e mantenibili per un piccolo insieme di valori. –

+0

int DOWN_THEN_OVER = 1; int OVER_THEN_DOWN = 1; int wackyDuck = 1;/* DOWN_THAN_OVER memorizzato come int potrebbe essere uguale a OVER_THAN_DOWN o solo un'anatra stravagante */ –

+2

@JohnHenkel - 'public static final int DOWN_THEN_OVER = 0; public static final int OVER_THEN_DOWN = 1; ... public static final int UP_THEN_AT_THEM = 92367; '-' turnPage (UP_THEN_AT_THEM) '- vedi il pericolo adesso? Con un 'enum' non puoi proprio farlo, neanche per errore. – OldCurmudgeon

-2

Se si utilizzano le enumerazioni solo per dare nomi ai programmatori ai numeri, e non è mai necessario scriverle sullo schermo, o leggerle da un file, allora è totalmente eccessivo. Sfortunato artefatto del fatto che tutto in java deve essere una classe. Se è così che stai usando l'enumerazione, ti consiglio di usare le costanti.

Se si desidera stampare il valore dell'enumerazione nel formato di facile utilizzo, o per convertire un valore in un enum, probabilmente è necessaria la classe.