我可以将此功能压缩到枚举中吗?我还想在另一个文件的 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 教程,Oracle:Enum Types
- Java 语言规范,Oracle:Enum Classes
关于java - 我可以将所有这些功能放入一个枚举中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67544624/