2010-04-15 8 views
6

Est-il possible d'avoir une enum qui change sa valeur (de l'intérieur de lui-même)? Peut-être qu'il est plus facile de comprendre ce que je veux dire avec le code:Aide avec enums 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? 
     } 
} 

Ce que je veux est veut atteindre:

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

Merci

Répondre

11

Oui. Vous pouvez simplement appeler

rate = Rate.Good; 

pour ce cas spécifique. Mais ce que je pense que vous cherchez vraiment, c'est une fonction de successeur.

Here vous êtes:

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. C'est probablement la meilleure solution. Beau code succinct aussi. – z5h

+1

Mais ... le 'Rate' ne va pas changer, n'est-ce pas? – OscarRyz

+0

@Oscar Je pense que l'idée est que dévoré ferait quelque chose comme 'rate = rate.successor();' – AaronLS

-1

Il devrait être possible, mais je dois admettre que je ne l'ai jamais essayé. À la fin, les enums ne sont que des objets avec une petite torsion, donc vous devriez être capable de le faire à moins que vous définissiez le champ de taux comme final.

2

Voulez-vous quelque chose comme ça?

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'exemple de la question tente de modifier la valeur de "rate" en appelant une méthode. C'est impossible, les valeurs enum sont des objets, donc vous ne pouvez pas les changer pour les mêmes raisons que vous ne pouvez pas attribuer une nouvelle valeur à "this". La chose la plus proche que vous pouvez faire est d'ajouter une méthode qui renvoie une autre valeur enum, comme proposé par Carl Manaster.

+2

+1: La vraie question originale (telle que clarifiée par "C'est ce que je veux faire") a seulement cette réponse: non, vous ne pouvez pas. – leonbloy

+0

Oui, je pense que je suis arrivé à la même conclusion moi-même. –