Java - 在自身内部使用枚举值

标签 java android enums libgdx

我们正在使用 libgdx 为 Android 设备制作游戏原型(prototype)。对于屏幕管理,我们使用带有屏幕名称的枚举来获取 ScreenManager 类的抽象层。因此,您可以执行以下操作来显示新屏幕并隐藏旧屏幕:ScreenManager.getInstance().show( Screens.LOGIN );

现在我们想使用设备的后退按钮跳回屏幕或退出应用程序。因此,我们想在每个枚举值中创建一个字段来声明parentScreen,并在按下后退按钮时使用它。不幸的是,不可能在其内部使用枚举自己的字段,我们收到以下错误:Cannot refer to the static enum field Screens.LOGIN within an initializerprotected Screens parentScreen = Screens.LOGIN; 。也许有人知道如何解决这个问题。

这是实际的枚举:

/**
 * Used to hide actual implementations of Screen interface and expose only "pointer objects".
 * All of them are declared with package-private class modifier.
 */
public enum Screens {

SPLASH {
    @Override
    protected Screen getScreenInstance( MyGdxGame game ) {
        return new SplashScreen( game );
    }
},

LOGIN {
    @Override
    protected Screen getScreenInstance( MyGdxGame game ) {
        return new LoginScreen( game );
    }
},

GAME {
    protected Screens parentScreen = Screens.LOGIN;

    @Override
    protected Screen getScreenInstance( MyGdxGame game ) {
        return new GameScreen( game );
    }
},

CREDITS {
    protected Screens parentScreen = Screens.LOGIN;

    @Override
    protected Screen getScreenInstance( MyGdxGame game ) {
        return new CreditsScreen( game );
    }
};

protected Screens parentScreen = null;

/** Every enum member musts override this method and it will be visible only inside the package */
protected abstract Screen getScreenInstance( MyGdxGame game );
}

此函数应显示父屏幕:

/**
 * Execute when the user clicks the back button
 * Default called by the AbstractScreen Class
 */
public void backButton() {
    this.show( this.currentScreen.parentScreen );
}

感谢您提前提出的建议!

最佳答案

有多种可能性。我最喜欢的是使用构造函数,因为它的文本较少,但更容易阅读:

public enum Screens {

SPLASH(Screens.LOGIN) {
    @Override
    protected Screen getScreenInstance( MyGdxGame game ) {
        return new SplashScreen( game );
    }
},

LOGIN(null) {//...}

;//this semi-colon is expected after the enum values

private final Screens parentScreen;

Screens(Screens parent){//Constructor
    parentScreen = parent;
}

public Screens getParentScreen(){
    return parentScreen;
}

protected abstract Screen getScreenInstance( MyGdxGame game );

另一种解决方案是声明一个抽象方法 getParentScreen():

public enum Screens {

SPLASH {
    @Override
    protected Screen getScreenInstance( MyGdxGame game ) {
        return new SplashScreen( game );
    }
    @Override
    protected Screen getParentScreen() {
        return Screens.LOGIN;
    }
},
//...
;

protected abstract Screen getScreenInstance( MyGdxGame game );
protected abstract Screen getParentScreen();

关于Java - 在自身内部使用枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26059095/

相关文章:

python - 如何对 Enum 的 __init__ 方法进行单元测试?

java - 我的资源未加载 - "Input stream must not be null"

java - Apache FTP 嵌入式服务器用于监听特定 IP

java - 通过输入流将字节流上传到 Google Drive

android - Google Game Services sPeers Disconnected/on P2P Disconnected not being called

java - 比较枚举值

java - 调整大小时图像质量下降

android - BottomSheetDialogFragment AdjustResize SoftInput 不起作用

android - Android中的 Activity , View 和对话框。正确的游戏应用程序结构

mysql - 将数据类型从 varchar 更改为 enum