2010-04-15 9 views
6

¿Es posible que una enumeración cambie su valor (desde adentro)? Tal vez sea más fácil de entender lo que quiero decir con código:Ayuda con enumeraciones en 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? 
     } 
} 

Esto es lo que quiero quiere lograr:

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

Gracias

Respuesta

11

Sí. Simplemente puede llamar al

rate = Rate.Good; 

para este caso específico. Pero lo que creo que realmente estás buscando es una función sucesora.

Here que son:

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. Esta es probablemente la mejor manera de hacerlo. Un bonito y breve código también. – z5h

+1

Pero ... la 'Tasa' en sí misma no cambiará ¿verdad? – OscarRyz

+0

@Oscar Creo que la idea es que devoured haría algo como 'rate = rate.successor();' – AaronLS

-1

Debería ser posible, pero tengo que admitir que nunca he intentado. Al final, las enumeraciones son solo objetos con un pequeño giro, por lo que debería poder hacerlo a menos que defina el campo de velocidad como final.

2

¿Desea algo como esto?

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

El ejemplo de la pregunta intenta cambiar el valor de "tasa" llamando a un método. Esto es imposible, los valores enum son objetos, por lo que no puede cambiarlos por las mismas razones por las que no puede asignar un nuevo valor a "this". Lo más cercano que puede hacer es agregar un método que devuelva otro valor enum, como lo propuso Carl Manaster.

+2

+1: La verdadera pregunta original (aclarada por "Esto es querer lo quiero lograr") solo tiene esta respuesta: no, no puedes. – leonbloy

+0

Sí, creo que llegué a la misma conclusión yo mismo. –

Cuestiones relacionadas