【问题标题】: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();
      }
    }
    

    基本上,我必须更改的只是在所有出现的MENUGAMEOPTION 前面添加一个限定GameState.,除了case 语句中的那些,因为编译器可以根据switch 中使用的表达式类型推断这些是GameState 的值。使用 enum 而不是 int 的另一个优点是,它将 gameState 的值限制为仅 3 个有效值,而不是整个整数范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 2012-02-24
      相关资源
      最近更新 更多