EnumType foo: Как мне написать foo.changeme ()? - PullRequest
1 голос
/ 02 августа 2011

Вот что я написал:

public class JavaApplication4 {
    private RunMode runMode;

    private enum RunMode {
        STOP, START, SCE, SIE;

        void reset() {
            this = STOP; // <=== 'cannot assign a value to final variable this.'
        }
    }

}

Как уже отмечалось, присвоение 'this' помечается. Почему «this» является окончательным и как я могу изменить значение переменной enum с помощью метода экземпляра enum?

Ответы [ 5 ]

2 голосов
/ 02 августа 2011

Перечисление существует, чтобы предоставить вам набор связанных констант, которые используются для описания некоторого состояния (в вашем случае, режима запуска приложения). По понятной причине экземпляры являются неизменяемыми: они должны представлять константы.

Вы действительно не хотите «сбрасывать» объект, который представляет режим запуска. Вы хотите сбросить режим запуска приложения. Таким образом, функциональность принадлежит классу приложения и реализуется путем присвоения другому объекту enum поля.

public class JavaApplication4 {
    private RunMode runMode;

    public void reset() {
        runMode = RunMode.STOP;
    }

    private enum RunMode {
        STOP, START, SCE, SIE;
    }
}
2 голосов
/ 02 августа 2011

Нет смысла переназначать уже созданный экземпляр Enum. Думайте о Enums как о единичных объектах. В вашем случае START, STOP, SCE и SIE - это одноэлементные объекты, которые предварительно созданы. Все, что вам нужно сделать, это передать их ссылку в вашем заявлении.

1 голос
/ 02 августа 2011

this не является изменяемой сущностью. Самый простой способ - переместить ваше reset() внутрь самого тела class:

public class JavaApplication4 {
    private RunMode runmode;

    private enum RunMode {
        STOP, START, SCE, SIE;
    }
    void reset() {  // <---- move it here
        runMode = RunMode.STOP; // <=== ok
    }
}
1 голос
/ 02 августа 2011

Перечисления - это просто набор констант, сгруппированных по одному типу.

Это то, что вы хотите:

private RunMode runMode;

private enum RunMode {
    STOP, START, SCE, SIE;
}

void reset() {
    runMode = RunMode.STOP;
}
1 голос
/ 02 августа 2011

Вы никогда не можете изменить значение перечисления от одного к другому. Перечисления должны быть константами. Похоже, вам, вероятно, следует вернуть STOP из метода reset() (и любых других потенциально изменяющих состояние методов) и написать:

runMode = runMode.reset(); // etc

Важно понимать, что перечисления являются ссылочными типами и предназначены для того, чтобы эффективно представлять собой набор константных значений. Вы не только не можете преобразовать одно значение в другое, но также не должны изменять значения любых полей в перечислении (кроме случаев, когда оно используется для кэширования).

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