【问题标题】:Case expressions must be constant expression案例表达式必须是常量表达式
【发布时间】:2014-03-29 03:25:33
【问题描述】:
处理语言有一些问题,它说 case 表达式必须是常量,但我可以发誓他们是。我不知道我在这里做错了什么。有人有什么建议吗?
int gameState;
static int MENU = 0;
static int GAME = 1;
static int OPTIONS = 2;
void setup() {
screenSizex = 960;
screenSizey = 640;
size(screenSizex, screenSizey);
gameState = MENU;
}
void draw(){
switch(gameState) {
case MENU:
//does menu stuff
break;
case OPTIONS:
//does options stuff
break;
case GAME:
//does game stuff
break;
default:
break;
}
}
void mousePressed() {
if (//over some object) {
gameState = GAME;
}
else if (//over some object) {
gameState = OPTIONS;
}
else if (//over some object) {
exit();
}
}
【问题讨论】:
标签:
java
switch-statement
case
processing
【解决方案1】:
static 只是使字段属于类而不是类的实例。静态字段可以随时修改,因此它不是恒定的。如果您希望将字段视为常量值,则需要将字段设置为 final:
static final int MENU = 0;
static final int GAME = 1;
static final int OPTIONS = 2;
将字段标记为static final意味着它们都存在于类级别(它们不属于类的任何特定实例,也不需要实例来访问值)并且在初始化后无法修改(有效地使值保持不变)。
但是,我认为这确实是您使用enumeration type 的好地方。以下是我更改游戏状态声明的方法:
GameState gameState;
enum GameState {
MENU, GAME, OPTIONS
}
以下是您必须执行的操作才能让其余代码使用它:
void setup() {
screenSizex = 960;
screenSizey = 640;
size(screenSizex, screenSizey);
gameState = GameState.MENU;
}
void draw(){
switch(gameState) {
case MENU:
//does menu stuff
break;
case OPTIONS:
//does options stuff
break;
case GAME:
//does game stuff
break;
default:
break;
}
}
void mousePressed() {
if (/*over some object*/) {
gameState = GameState.GAME;
}
else if (/*over some object*/) {
gameState = GameState.OPTIONS;
}
else if (/*over some object*/) {
exit();
}
}
基本上,我必须更改的只是在所有出现的MENU、GAME 和OPTION 前面添加一个限定GameState.,除了case 语句中的那些,因为编译器可以根据switch 中使用的表达式类型推断这些是GameState 的值。使用 enum 而不是 int 的另一个优点是,它将 gameState 的值限制为仅 3 个有效值,而不是整个整数范围。