2010-04-15 15 views
6

E 'possibile che un enum modifichi il suo valore (dall'interno stesso)? Forse è più facile capire cosa intendo con il codice:Aiuto con le enumerazioni in Java

enum Rate { 
    VeryBad(1), 
    Bad(2), 
    Average(3), 
    Good(4), 
    Excellent(5); 

    private int rate; 

    private Rate(int rate) { 
     this.rate = rate; 
    } 

     public void increateRating() { 
      //is it possible to make the enum variable increase? 
      //this is, if right now this enum has as value Average, after calling this 
      //method to have it change to Good? 
     } 
} 

Questo è vuole che voglio ottenere:

Rate rate = Rate.Average; 
System.out.println(rate); //prints Average; 
rate.increaseRating(); 
System.out.println(rate); //prints Good 

Grazie

risposta

11

Sì. Potresti semplicemente chiamare

rate = Rate.Good; 

per questo caso specifico. Ma quello che penso tu stia davvero cercando è una funzione successore.

Here sei:

public class EnumTest extends TestCase { 
    private enum X { 
     A, B, C; 
     public X successor() { 
       return values()[(ordinal() + 1) % values().length]; 
     } 
    }; 

    public void testSuccessor() throws Exception { 
     assertEquals(X.B, X.A.successor()); 
     assertEquals(X.C, X.B.successor()); 
     assertEquals(X.A, X.C.successor()); 
    } 
} 
+0

+ 1. Questo è probabilmente il modo migliore per andare. Bel codice succinto anche. – z5h

+1

Ma ... il 'Tasso' non cambierà? – OscarRyz

+0

@Oscar Penso che l'idea è che divorato farebbe qualcosa come 'rate = rate.successor();' – AaronLS

-1

Dovrebbe essere possibile, ma devo ammettere che non ho mai provato. Alla fine le enumerazioni sono solo oggetti con una piccola svolta, quindi dovresti essere in grado di farlo a meno che tu non definisca il campo rate come finale.

2

Vuoi qualcosa di simile?

class Rate { 
    private static enum RateValue { 
     VeryBad(1), 
     Bad(2), 
     Average(3), 
     Good(4), 
     Excellent(5); 

     private int rate; 

     public RateValue(int rate) { 
      this.rate = rate; 
     } 

     public RateValue nextRating() { 
      switch (this) { /* ... */ } 
     } 
    } 

    private RateValue value; 

    public void increaseRating() { 
     value = value.nextRating(); 
    } 
} 
2

L'esempio nella domanda tenta di modificare il valore di "tasso" chiamando un metodo su di esso. Questo è impossibile, i valori enum sono oggetti, quindi non puoi cambiarli per gli stessi motivi per cui non puoi assegnare un nuovo valore a "questo". La cosa più vicina che puoi fare è aggiungere un metodo che restituisca un altro valore enum, come proposto da Carl Manaster.

+2

+1: La vera domanda originale (come chiarito da "Questo è voglio voglio raggiungere") ha solo questa risposta: no, non puoi. – leonbloy

+0

Sì, penso di essere arrivato alla stessa conclusione anch'io. –

Problemi correlati