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