案例表达式必须是常量表达式

Syt*_*the 2 java processing case switch-statement

在处理语言中有一些问题,它说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();
  }
}
Run Code Online (Sandbox Code Playgroud)

Dao*_*Wen 8

static只是使字段属于类而不是类的实例.可以随时修改静态字段,因此它不是常量.final如果希望将字段视为常量值,则需要创建字段:

static final int MENU = 0;
static final int GAME = 1;
static final int OPTIONS = 2;
Run Code Online (Sandbox Code Playgroud)

将字段标记为static final它们都存在于类级别(它们不属于类的任何特定实例,也不需要实例来访问值)并且在初始化后无法修改(有效地使值保持不变) ).

但是,我认为这对你来说真的是一个使用枚举类型的好地方.这是我如何改变游戏状态声明:

GameState gameState;
enum GameState {
  MENU, GAME, OPTIONS
}
Run Code Online (Sandbox Code Playgroud)

以下是您需要做的其余代码才能使用它:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

基本上我必须改变的是GameState.在所有出现之前添加一个限定符MENU,GAME并且OPTION除了case语句中的那些之外,因为编译器可以GameState根据表达式中使用的表达式来推断那些是值switch.使用a enum而不是a int具有额外的优点,即它将值限制gameState为仅3个有效值,而不是整个整数范围.