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

时间:2014-03-29 03:25:34

标签: java switch-statement case processing

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

1 个答案:

答案 0 :(得分:8)

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

基本上,我必须更改的是在GameState.MENUGAME的所有出现之前添加符合条件的OPTION,但不包括case语句,因为编译器可以根据GameState中使用的表达式的类型推断出这些是switch的值。使用enum代替int具有额外的优势,即它将gameState的值仅限制为3个有效值,而不是整个整数范围。