首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递枚举并返回新类

传递枚举并返回新类
EN

Stack Overflow用户
提问于 2021-07-14 05:58:02
回答 1查看 48关注 0票数 1

我希望创建一个SceneManager类来提供对单个活动场景的有限控制,方法包括setActiveScene(Scenes newScene) (其中Scenes是一个枚举)、updateScene(double time) (包装活动Scene的更新方法)和getActiveScene() (检索活动场景的某些组件)。希望只有SceneManager可以创建新的场景,并且添加新的可能场景就像向Scenes枚举中添加要实例化的类一样简单。我得到的是这样的东西:

代码语言:javascript
复制
public class SceneManager {
    private static Scene activeScene = null;

    private static void setActiveScene(Scenes newScene) {
        activeScene = newScene.load();
    }

    public enum Scenes {
        START(new StartScene()), MENU(new MenuScene());
    
        private final Scene scene;
    
        Scenes(Scene scene) {
            this.scene = scene;
        }
        
        protected Scene load() { return scene; }
    }
}

它在某种程度上起作用了,除了我需要Scene只在它被设置的时候初始化。此设置会立即初始化所有场景,但这将不起作用。我希望找到一个比switch语句更干净的解决方案,但我不确定现在还能如何让它工作。我试着在Constructor上乱搞,但那比开关更乱,而且效率可能也低得多。

EN

回答 1

Stack Overflow用户

发布于 2021-07-14 07:00:42

有两个选项:

不要在它们的构造函数中初始化场景,而是使用init方法:

代码语言:javascript
复制
interface Scene {
  void init();
  ...
}
...
private static void setActiveScene(Scenes newScene) {
  activeScene = newScene.load();
  activeScene.init();
}

不要在初始化enum时创建场景,只有在加载时才会创建:

代码语言:javascript
复制
public enum Scenes {
  START(StartScene.class), MENU(MenuScene.class);
  private final Class<Scene> sceneClass;
  ...
  protected Scene load() {
    try {
      return sceneClass.getDeclaredConstructor().newInstance();
    } catch (InvocationTargetException e) {
      throw new RuntimeException(e);
    }
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68369749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档