为什么if语句不能检测我的游戏状态

joe*_*nte 1 java plugins enums listeners

我是Java的新手,我在代码中遇到了一个"错误",我无法理解/修复.为了给你一些背景知识,我设置了一个说明所有游戏状态的枚举(下面)

public enum GameState {

    IN_LOBBY(true), IN_GAME(false), POST_GAME(false), RESETTING(false);

    private boolean canJoin;    
    private static GameState currentState;

    GameState(boolean canJoin) {
        this.canJoin = canJoin;
    }

    public boolean canJoin() {
        return canJoin();
    }

    public static void setState(GameState state) {
        GameState currentState = state;
    }

    public static boolean isState(GameState state) {
        return GameState.currentState == state;
    }

    public static GameState getState() {
        return currentState;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的main.java类中,我在onEnable方法中指定将GameState设置为IN_LOBBY.

基本上我想要做的是在BlockBreakEvent Listener我想说的是

if (GameState.isState(GameState.IN_LOBBY)) {
    Location bLoc = block.getLocation();
    ChatUtilties.errorPlayer("You may not break blocks at this time.", player);
    bLoc.getBlock().setType(Material.type);
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我试图检测GameState是否是IN_LOBBY,如果是这样,那么玩家就不能打破阻挡.但目前出现了两个问题.

  1. 出于某种原因,当GameState是IN_LOBBY插件时甚至不会注意到.它只是忽略了if语句.它甚至不会发送消息,就好像游戏状态不是IN_LOBBY.

  2. 我不确定如何根据玩家破坏的块来动态更改材料.

OH *_*ERS 5

你的二传手是错的:

public static void setState(GameState state) {
    GameState currentState = state;
}
Run Code Online (Sandbox Code Playgroud)

您在此处创建新的局部变量currentState,而不是使用现有字段.发生这种情况是因为您在其前面编写了变量类型,从而创建了一个新的初始化语句.

而是使用:

public static void setState(GameState state) {
    currentState = state;
}
Run Code Online (Sandbox Code Playgroud)

(因为currentState是一个静态字段GameState.currentState = state;也可以在这种情况下工作)

编辑:

另一个问题是你的canJoin方法.

public boolean canJoin() {
    return canJoin();
}
Run Code Online (Sandbox Code Playgroud)

此方法在没有任何结束条件的情况下递归调用自身.因此,如果您尝试调用它,您将获得StackOverflowException.

相反,你可能想要返回canJoin字段:

public boolean canJoin() {
    return canJoin;
}
Run Code Online (Sandbox Code Playgroud)