Помогите с перечислениями в Java - PullRequest
6 голосов
/ 15 апреля 2010

Возможно ли, чтобы enum изменил свое значение (изнутри себя)? Может быть, легче понять, что я имею в виду с кодом:

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?
       }
}

Это то, чего я хочу достичь:

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

Спасибо

Ответы [ 4 ]

11 голосов
/ 15 апреля 2010

Да.Вы можете просто позвонить

rate = Rate.Good;

для этого конкретного случая.Но я думаю, что вы действительно ищете преемника.

Здесь Вы находитесь:

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());
    }
}
2 голосов
/ 15 апреля 2010

Пример в вопросе пытается изменить значение «rate», вызывая для него метод. Это невозможно, перечисляемые значения являются объектами, поэтому вы не можете изменить их по тем же причинам, по которым вы не можете назначить новое значение для «this». Самое близкое, что вы можете сделать, это добавить метод, который возвращает другое значение перечисления, как предложено Карлом Манастером.

2 голосов
/ 15 апреля 2010

Хочешь что-нибудь подобное?

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();
    }
}
0 голосов
/ 15 апреля 2010

Это должно быть возможно, но я должен признать, что никогда не пробовал. В конце перечисления - это просто объекты с небольшим изгибом, так что вы сможете это сделать, если не определите поле ставки как окончательное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...