我可以将所有这些功能放入一个枚举中吗?

时间:2021-05-15 08:15:04

标签: java enums

我可以将此功能压缩到枚举中吗?我还想在另一个文件的 switch 语句中使用枚举。如果可能的话,我也想把事情保密。我知道你可以对 Java 中的枚举做更多的事情,但文献有点混乱。

public static class SCENE {
    public enum scene {
        MENU,
        PLAY
    }

    public static scene current = scene.MENU;

    public static void switchToMenu() {
        current = scene.MENU;
    }

    public static void switchToPlay() {
        current = scene.PLAY;
    }

};

2 个答案:

答案 0 :(得分:1)

枚举类 (enum) 与普通类类似,但受限制:

  • 唯一的实例是声明的常量;不能在运行时创建新实例,甚至不能使用反射或 clone;
  • 直接超类是 Enum<E>;
  • 无法扩展;
  • 不能声明abstract
  • 一些涉及修饰符的限制。

尽管如此(还有一些我忘记了),可以用 普通 类完成的所有事情,都可以用 enum 完成:使用所有类型的字段和方法。甚至每个枚举常量也可以有自己的字段或方法。

但是,正如已经评论过的,并不是所有的东西都是有意义的或推荐的 - 比如有一个状态,非 final 字段。

public class Scene {

    public enum Type {   // maybe SceneType?
        MENU,
        PLAY;

        private void switchTo() {  // instance method, just an example
            current = this;  // bad example, should not change `Scene`'s state
        }
    }

    public static Type current = Type.MENU;

    public static void switchTo(Type type) {
        Objects.requireNonNull(type);
        current = type;
        /* alternative, to show switch usage
        switch (type) {
            case PLAY: 
                current = Type.PLAY; 
                break;
            case MENU:
                ...
        */
    }

    // just for demonstration, not the best solution
    public static void switchToMenu() {
        Type.MENU.switchTo();
    }

    public static void switchToPlay() {
        Type.PLAY.switchTo();
    }

}

未测试,没有损坏(使用)IDE,小错误留给用户解决

对于上述简单的情况,我建议只在 switchTo(Type) 中使用 Scene 方法; 不是 switchTo() 中的 Type - 添加只是作为可以做什么的示例。 Type.switchTo() 方法很奇怪,它正在访问 Scene 的字段,这不仅仅是一种类型,是此类功能的错误位置。 >

Obs:由于枚举类的工作方式与普通类一样,因此它们也可以在自己的文件中声明。但是对于发布的代码,由于 绑定Scene,它可以保留为嵌套枚举 - 必须像 Scene.Type.PLAY 一样从其他类访问。 (您的 SCENE 看起来像是嵌套的 - static 关键字不允许在顶级类中使用 - 所以实际路径会更长,例如SomeClass.Scene.Type.PLAY

链接:

答案 1 :(得分:0)

你可以使用 current 作为字符串

public enum Scene {
    MENU  ("MENU"),
    PLAY  ("PLAY");
    private final String current;
    private Scene (String current) {
        this.current = current;
    }
}