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

标签 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;
    }

};

最佳答案

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

  • 唯一的实例是声明的常量;运行时无法创建新实例,甚至不能使用反射或 clone ;
  • 直接父类(super class)是 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 的字段,这不仅仅是一种类型,这种功能的错误位置。

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

链接:

关于java - 我可以将所有这些功能放入一个枚举中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67544624/

相关文章:

PHP filter_input 验证标志是枚举吗?

c# - “标准化”概率数组

java - 使用什么IDE?

c# - Enum.Parse() 或 Switch

c# - 从枚举自动生成 DataGrid 列

java - 在 Java 枚举定义中使用序号

java - 发送字符串到php服务器

java - 从一个列表创建多个列表(按特定字段对列表的对象进行分组)

java - 为什么 compareTo 在应该为 false 时返回 true?

swift - 切换映射 : how to map enum to value without switch