我們正在使用libgdx爲Android設備創建遊戲原型。對於屏幕管理,我們使用帶有屏幕名稱的枚舉來獲取ScreenManager類的抽象層。所以你可以做這樣的事情來顯示一個新的屏幕,並隱藏舊屏幕:ScreenManager.getInstance().show(Screens.LOGIN);
Java - 在其內部使用枚舉值
現在我們想要使用設備的後退按鈕跳回屏幕或退出應用程序。所以我們想在每個枚舉值中創建一個字段來聲明parentScreen並在按下後退按鈕時使用它。不幸的是,它不能在自己內部使用枚舉自己的字段,我們得到以下錯誤:Cannot refer to the static enum field Screens.LOGIN within an initializer
在protected 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);
}
感謝您的建議提前!
我的建議是:當一個枚舉開始看起來太像一個普通的類,使用一個普通的類。您可以在該類中定義該類的公共靜態實例,因此您仍然可以將它們稱爲Screens.LOGIN。 – Davio 2014-09-26 12:06:00
即使您以這種方式成功強制使用枚舉概念,由於它的剛性,它很可能會在後面反彈。您應該嘗試更好地確定業務邏輯必須執行的操作以及它的工作原理。 – allprog 2014-09-26 12:15:01
感謝您的建議 - 如果枚舉變得更加複雜,並獲得一些邏輯,我會考慮使用類。 – Rubberducker 2014-09-26 12:55:23