gpt4 book ai didi

java - Case 表达式必须是常量表达式

转载 作者:行者123 更新时间:2023-12-02 09:05:59 36 4
gpt4 key购买 nike

处理语言存在一些问题,它说 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();
}
}

最佳答案

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();
}
}

基本上,我需要更改的就是在所有出现的 MENUGAMEOPTION 前面添加一个合格的 GameState. ,除了 case 语句中的值,因为编译器可以根据语句中使用的表达式的类型推断出这些是 GameState 的值。 切换。使用 enum 而不是 int 具有额外的优势,它将 gameState 的值限制为仅 3 个有效值,而不是整个整数范围。

关于java - Case 表达式必须是常量表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22726610/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com