如何调用Enum单独的方法?

2023-12-10

我有一个枚举,可能如下所示。我的目标是拥有一个enum使用一些常见方法(我通过添加抽象方法来强制执行此操作)和一些“枚举值个体”方法。

以下代码编译:

public enum MyEnum {

    VALUE {
        @Override
        public void syso() {
            System.out.println("VALUE syso");
        }
    },

    SPECIAL_VALUE {
        @Override
        public void syso() {
            System.out.println("SPECIAL_VALUE syso");
        }

        public void sayHello() {
            System.out.println("Hello");
        }
    };

    public abstract void syso();

    public static void main(String... args) {
        MyEnum.VALUE.syso();
        MyEnum.SPECIAL_VALUE.syso();
    }

}

运行此命令会打印以下结果:

VALUE syso
SPECIAL_VALUE syso

然而试图打电话sayHello(),我在中定义SPECIAL_VALUE,不起作用。

将以下内容添加到 main 方法中,不再编译:

public static void main(String... args) {
    MyEnum.SPECIAL_VALUE.sayHello(); // does not work
}

这是为什么?对我来说似乎完全没问题,但找不到方法。有什么办法可以调用这个方法吗?也许通过反射?

我也想避免使此方法抽象,因为它对于任何其他枚举值都没有意义。我也不能extend这个枚举并添加这个特殊方法,同时继承通用方法。我还想避免添加某种单例类来“模拟”这一点。

无论如何可以运行这个吗?如果没有,我最好的选择是什么?


这是为什么?

原因在JLS:

8.9.1.枚举常量

...

枚举类体中声明的实例方法可以在封闭枚举类型之外调用仅当它们覆盖封闭枚举类型中的可访问方法时(第 8.4.8 节).

有什么办法可以调用这个方法吗?也许通过反射?

考虑到上述约束,如果您不想公开封闭枚举类中的方法,那么反射是唯一的选择。每个枚举常量都创建为内部类,例如MyEnum$1 and MyEnum$2在你的例子中。因此,您可以检索Class通过常数的getClass()方法,然后通过反射调用你的方法(省略异常处理):

...
Class c = MyEnum.SPECIAL_VALUE.getClass();
Method m = c.getMethod("sayHello");
m.invoke(MyEnum.SPECIAL_VALUE);
...

我很可能会尝试避免反射并公开枚举类中的方法,并让它抛出一个UnsupportedOperationException:

...
public void sayHello() {
    throw new UnsupportedOperationException();
}
...

这至少可以在运行时捕获意外的调用 - 它仍然不允许编译器在编译时捕获它们,但反射方法也不能捕获它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何调用Enum单独的方法? 的相关文章

  • 无法在 IntelliJ IDEA 中导入 javax.validation.constraints

    I can t import that simple library i have all jar files also i tried Ivalidate Caches Restart Maybe i have to add valida
  • 模块化应用程序堆栈中的虚拟数据和单元测试策略

    如何管理用于测试的虚拟数据 将它们保留在各自的实体中 在一个单独的测试项目中 使用外部资源的序列化程序加载它们 或者只是在需要的地方重新创建它们 我们有一个应用程序堆栈 其中包含多个模块 这些模块依赖于另一个模块 每个模块都包含实体 每个模
  • 在非 Spring-Boot 应用程序中使用 @ConfigurationProperties

    我正在尝试使用 ConfigurationProperties 在我的 Spring MVC 应用程序 非 Spring Boot 中启用配置绑定 到目前为止我做的唯一一件事就是添加了 Mavenspring boot依赖于我的项目 以获得
  • 如何重写 Lombok Setter 方法

    我在我的项目和生成中使用 lombokSetters and Getters using Setters and GettersPOJO 类之上的注释 我正在尝试覆盖属性的 setters 方法 但它不起作用 我想检查 JSON 属性是 E
  • 媒体对象上的 javafx UNKNOWN 持续时间

    我是 Java 和 JavaFX 的新手 过去几年我一直在使用 QT 在 Python 上进行开发 现在我正在使用 Java 和 JavaFX 进行开发 我正在开发一个程序 可以为用户设定的时间播放音乐文件 然后停止 因此 我需要从媒体对象
  • android下拉刷新列表视图出错

    我正在使用功能下拉来刷新library https github com chrisbanes Android PullToRefresh克里斯班斯的 但是当我尝试在我的 xml 文件中导入这个小部件时 它向我显示以下错误 请帮助我如何解决
  • 使用 Jackson 从 JSON 文件中删除空元素

    我正在尝试从 JSON 文件中删除一个元素 Lorem Ipsum 4 Lorem Ipsum 5 keyToRemove value 使用以下代码 我可以删除键和值 for JsonNode personNode rootNode if
  • 当我尝试使用 LWJGL 库加载声音时,为什么会收到错误“NoClassDefFoundError: sun/misc/Unsafe”?

    This is the screenshot of my Eclipse project files 当我尝试启动时出现以下错误new Sound Res MouseClick ogg 我的班级中的对象AudioPlayer在第 15 行
  • 按下 JButton 时运行函数

    我正在尝试用java编写一个程序 使用机器人每隔几秒按一次特定的键 它有一个带有开始和停止按钮的 GUI 以及一个告诉其处于哪个状态的标签 到目前为止 我已经完成了所有工作 除了当我单击 开始 时 它运行我的机器人功能的循环 这是无限的 没
  • 什么是运行时绑定?

    根据 Android 开发者指南 Intent 是一个提供运行时绑定独立组件之间 例如两个活动 什么是 运行时绑定 继承创建类型兼容性 它允许超类引用 引用子类的对象 反过来则不然 超类引用 指的是 子类的对象 只能用于 访问继承的和重写的
  • Java 让物体在按住按钮时移动

    如何使 JPanel 在按住按钮时移动并在释放按钮时停止 我尝试过将 thread start 与 Runnable 一起使用以及类似的方式 我总是遇到错误 有人可以帮助我吗 您需要考虑许多重要的因素 按钮的设计初衷并非如此 它们被设计为在
  • 关于final关键字的java基础知识

    方法中可以使用final关键字吗 绝对地 这final关键字几乎可以应用于任何事物 在每种情况下都意味着 您无法再更改它 这就是它应用于时的含义 一个变量 您根本无法为变量分配新值 将其呈现为constant 当然 a method 您不能
  • spring - 构造函数注入和重写嵌套 bean 的父级定义

    我读过 Spring 3 参考资料继承bean定义 http static springsource org spring docs 3 0 x spring framework reference html beans html bean
  • 类内枚举前向声明是否可能? [复制]

    这个问题在这里已经有答案了 我知道在 C 11 中可以转发声明枚举类型 如果提供了存储类型 例如 enum E short void foo E e enum E short VALUE 1 VALUE 2 但我想转发声明一个类中定义的枚举
  • 在内存对象缓存中开发

    我正在开发一个基于网络的医疗应用程序 需要创建一个小型内存对象缓存 这是我的用例 我们需要显示需要某些东西 血液 肾脏等 的人提交的请求列表 并且它不会是一个巨大的列表 因为在某一天对血液或其他任何东西的请求将是有限的 请注意 我们不想使用
  • 从 Runnable 类内部访问共享变量

    我需要在主类的 main 方法中定义一个共享变量 我需要两个线程才能访问该共享变量 我通过实现 Runnable 接口并实现该接口的抽象 run 方法来创建线程 如何从实现 Runnable 接口的类中定义的 run 方法中引用 Main
  • 如何使用 Firebase 查询中的信息填充 Android ListView

    这是我的第一篇文章 所以如果我没有遵循我应该遵循的一些协议 我深表歉意 我正在尝试使用 Firebase 数据库中的一些信息填充 ListView 我认为我遇到的问题是对数据库的查询太慢 线程可能正在下载图片 并且我的活动加载其活动布局而不
  • Java 8 并行流和 ThreadLocal

    我试图弄清楚如何在 Java 8 并行流中复制 ThreadLocal 值 所以如果我们考虑一下 public class ThreadLocalTest public static void main String args Thread
  • 如何在servlet应用程序中更改用户的tomcat密码?

    我们的 Web 应用程序部署在 Tomcat 上 目前使用 UserDatabaseRealm 来确保安全 我们希望在应用程序中提供一个页面 用户可以在其中更改密码 一个简单 常见的 Web 应用程序功能 我找不到任何示例 servlet
  • 将 JTable 安装在面板中

    我正在使用 JTable 并将其添加到使用 gridbaglayout 的面板 如下所示 JTable qdbs new JTable rowData columnNamesVector qdbs setAutoResizeMode JTa

随机推荐