2013-07-15 14 views
14

È possibile implementare l'operatore ++ per un enum?Esiste un operatore di incremento ++ per enum Java?

Gestisco lo stato corrente di un state machine con un enum e sarebbe bello poter utilizzare l'operatore ++.

+0

Se si sta parlando di sovraccarico dell'operatore, no, questo non può essere eseguito con Java – BackSlash

+5

Vedere [questa risposta] (http://stackoverflow.com/a/17006263/18157). Nota che ++ non può avere una controparte diretta per le enumerazioni perché una costante enum è immutabile. Il meglio che puoi fare è definire un metodo 'next()' che restituisce il successivo valore enum. –

+3

Questo è un paragone fuorviante: le costanti intere sono anch'esse immutabili (in questo '++' non cambia ciò che '5' significa), ma' ++ 'funziona bene perché cambia * quale * numero intero il tuo locale" si riferisce a " . '++' sulle enumerazioni potrebbe fare la stessa cosa, cambiando la 'season' locale in modo che punti a' SUMMER' invece di 'SPRING'. – amalloy

risposta

37

Non si può "incrementare" un enum, ma si può ottenere il prossimo enum:

// MyEnum e; 
MyEnum next = MyEnum.values()[e.ordinal() + 1]; 

Ma meglio sarebbe quello di creare un metodo di istanza sul tuo enum.

Nota bene come il valore successivo problematica viene gestito per l'ultima istanza enum, per i quali non esiste un "prossimo" istanza:

public enum MyEnum { 

    Alpha, 
    Bravo, 
    Charlie { 
     @Override 
     public MyEnum next() { 
      return null; // see below for options for this line 
     }; 
    }; 

    public MyEnum next() { 
     // No bounds checking required here, because the last instance overrides 
     return values()[ordinal() + 1]; 
    } 
} 

Così si potrebbe fare questo:

// MyEnum e; 
e = e.next(); 

Il le scelte ragionevoli per l'implementazione del metodo next() nascosto includono:

  • return null; // there is no "next"
  • return this; // capped at the last instance
  • return values()[0]; // rollover to the first

Override del metodo evita il costo potenziale di generazione della matrice values() per controllare la sua lunghezza. Ad esempio, un'implementazione per next() dove l'ultima istanza non si sostituzione potrebbe essere:

public MyEnum next() { 
    if (ordinal() == values().length - 1) 
     throw new NoSuchElementException(); 
    return values()[ordinal() + 1]; 
} 

Qui, sia ordinal() e values() sono (di solito) chiamato due volte, che avrà un costo più eseguire oltre la versione precedente sopra.

+0

Non hai davvero bisogno del parametro 'MyEnum' nel metodo' next', vero? –

+0

@MichaelLang damn - Ho iniziato con un metodo statico, quindi l'ho modificato in un metodo di istanza, ma ho lasciato il parametro in :(Thx. – Bohemian

+0

La risposta di Jim Garrison (vedi il suo link sopra) chiama valori() solo una volta - ogni chiamata copia l'array. Inoltre, gestisce l'incremento oltre la fine dell'enumerazione, con l'operatore modulo. –

4

No. Java non supporta l'overloading dell'operatore personalizzato per qualsiasi tipo definito dall'utente, incluse le enumerazioni.

Tuttavia, è possibile definire un metodo nella classe enum che ha restituito il prossimo enumeratore.