EnumType foo:如何编写foo.changeme()?

时间:2011-08-02 06:40:44

标签: java methods enums instance

这是我写的:

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'是最终的,如何用枚举实例方法更改枚举变量的值?

5 个答案:

答案 0 :(得分:2)

重新分配已经实例化的Enum真的没有意义。 将Enums视为单例对象。在您的情况下,START,STOP,SCE和SIE都是预先实例化的单例对象。您所做的只是在您的申请中传递他们的参考。

答案 1 :(得分:2)

枚举的存在是为了提供一组相关常量,用于描述某些状态(在您的情况下,是应用程序的运行模式)。实例是不可变的,理由很充分:它们应该代表常量。

您实际上并不想“重置”表示运行模式的对象。您想要重置应用程序的运行模式。因此,该功能属于应用程序类,它通过为字段分配不同的枚举对象来实现。

public class JavaApplication4 {
    private RunMode runMode;

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

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

答案 2 :(得分:1)

您永远不能将枚举的值从一个更改为另一个。枚举意味着常数。听起来你应该从STOP方法(以及任何其他可能改变状态的方法)返回 reset()并写下:

runMode = runMode.reset(); // etc

重要的是要理解枚举是引用类型,并且有效地是常量值的集合。你不仅不能将一个值变异为另一个值,而且你也不应该改变枚举中任何字段的值(除非是用于缓存)。

答案 3 :(得分:1)

枚举只是一组在一种类型下组合在一起的常量。

这就是你想要的:

private RunMode runMode;

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

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

答案 4 :(得分:1)

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