Java基于枚举类型创建对象的方法

2024-01-07

我的班级是这样的:

class X {}
class Y extends X {};
class Z extends X {};

我有每个子类(id + class)的枚举:

enum Type {
   Y_TYPE(1, Y.class), Z_TYPE(2, Z.class);
   int id;
   Class c;
   public Type(int id, Class c) { this.id = id; this.c = c; }
   public static X createInstance() throws Exception {
      return c.newInstance();
   }
}

然后我按如下方式使用它们:

X parseFromID(int id) {
   for (Type v : Type.values()) {
     if (v.id == id) {
        return v.createInstance();
     }
   }
}

它工作正常,但我想知道这是否是一种基于整数 id 创建数据的 Java 方法?有什么不好的地方需要寻找吗?

有没有办法强制传入 are 的 X 类型的类,而无需冗长的 if-else 条件?想想当我有大量子类时。


为什么要处理整数 id?

我正在编写某种解析器,因此我需要将从某处获取的整数 id 转换为适当的对象。


这里确实没有理由使用反射。抛出异常也是一种不好的做法,如果不使用反射,就不必处理反射异常。你可以简单地做

enum Type {
    Y_TYPE(1) {
        @Override
        public X createInstance() {
            return new Y();
        }
    }, Z_TYPE(2) {
        @Override
        public X createInstance() {
            return new Z();
        }
    };

    private int id;

    private Type(int id) { 
        this.id = id; 
    }

    public abstract X createInstance();
}

这也很有帮助,因为它不会强制每个子类都有一个公共的无参数构造函数,并且如果可能的话,还允许返回 X 或 Y 的相同实例。

如果您担心匿名类定义的冗长性,则可以将它们替换为 lambda(如果您使用的是 Java 8):

import java.util.function.Supplier;

enum Type {
    Y_TYPE(1, X::new), Z_TYPE(2, Y::new);

    private int id;
    private Supplier<X> supplier;

    private Type(int id, Supplier<X> supplier) {
        this.id = id;
        this.supplier = supplier;
    }

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

Java基于枚举类型创建对象的方法 的相关文章

随机推荐

  • 在 SQL Server 2008 R2 中获取时区

    如何获取 Microsoft SQL Server 2008R2 中的时区列表 在 SQL Server 2008 中使用时区数据 http blogs msdn com b sqlprogrammability archive 2008
  • UDP 服务器出现分段错误

    我使用 UDP 编写了以下回显服务器 但我不知道为什么它在 sendto 函数中给我分段错误 它接收良好 但在将数据发送回客户端时出现问题 我已经尝试找到问题几个小时了 但一无所获 有人可以指出错误或我可能做错了什么吗 谢谢 include
  • Angularjs 使用自定义插值符号作为范围

    我目前有一个 underscore js 模板 我也想将其与 Angular 一起使用 并且仍然可以与 underscore 一起使用 我想知道是否可以使用指令更改特定范围的插值开始和结束符号 如下所示 angular directive
  • Android 中用于接听电话的滑块按钮

    我想为来电开发自己的 接受 和 拒绝 按钮 为了防止从口袋里拿出手机时意外接听或拒绝来电 我想制作一个滑块式按钮或类似的东西 我是 接听电话不仅仅是点击 接听 按钮 这更像是从左向右 或相反 滑动手指 让按钮随着时间变宽 就像安卓一样 有什
  • 自定义 ASP.NET Identity 2.0 UserStore - 是否需要实现所有接口?

    我创建了一个自定义IUserStore
  • h2o 模型不适合驱动程序节点的内存错误

    我通过 H2O 中的 R 代码运行 GBM 模型 并得到以下错误 相同的代码在几周内运行良好 想知道这是 H2O 方面的错误还是用户系统上的配置 water exceptions H2OModelBuilderIllegalArgument
  • 将MySQL数据库置于版本控制之下?

    我目前在我的 PHP 项目中使用 SVN 我想我也应该将我的数据库置于版本控制之下 但是最好的方法是什么 我是否只需在 SVN 中的项目中创建一个 db 文件夹 将 SQL 更改粘贴到名为 from 1 0 to 2 0 sql 的文件中并
  • 使用 jQuery 实际设置选项元素上的选定属性

    我正在使用 jQuery 中的选项元素生成一个选择列表 简化后看起来像这样 var sel
  • std::shuffle 的使用和实用性?

    如果你查看 C 11 中随机洗牌的规范 就会发现有 3 个函数 我的问题是 的典型用途和优点是什么 template lt class RandomIt class URNG gt void shuffle RandomIt first R
  • #if 0 ..... #endif 块到底有什么作用?

    In C C 放置在 if 0 endif block if 0 Code goes here endif 代码是否只是被跳过并因此不被执行 它不仅没有被执行 甚至没有被编译 if是一个预处理器命令 在实际编译步骤之前对其进行评估 该块内的
  • 如何在 Android 中读取 Chrome 历史记录

    只看历史可以吗 通过使用以下代码 我可以获得历史记录和书签 但我只想阅读历史记录 String proj new String Browser BookmarkColumns TITLE Browser BookmarkColumns UR
  • Ruby 轻松搜索哈希数组中的键值对

    假设我有这个哈希数组 href gt https company campfirenow com name gt Company id gt 123456789 product gt campfire href gt https basec
  • Hadoop 中的数据复制错误

    我正在我的机器上实现 Hadoop 单节点集群 方法如下迈克尔 诺尔的教程 http www michael noll com wiki Running Hadoop On Ubuntu Linux 28Single Node Cluste
  • WPF ListView箭头导航和击键问题

    我有一个只读 WPF listView 但有两个问题 1 当我加载listView时 我在后面的代码中设置了selecteditem 它工作正常 但是当我使用向上 向下箭头键浏览列表时 它总是跳转到开始时的第一项 2 我无法使用按键来选择项
  • 用于将 html 解析为 DOM 层次结构树的 php lib

    我需要一些 php 库来将 html 内容解析为 DOM 树 像这样 html head title title content meta meta content body div div div content etc 并修复或清理无效
  • 信号:MPI C++ 中的分段错误 (11)

    我有一个代码 它计算 MPI 中整数的平均值 include
  • 将字符串数组转换为 TypeScript 类型

    假设我有一个字符串数组 const s foo rolo zoombaz 所以我会得到 type v foo string rolo string zoombaz string 奖金 理想情况下 我希望将它们映射到驼峰式大小写 所以如果我有
  • 关于依赖共享的 Maven 多模块项目组合

    有几个类似的问题 但没有这样的 您如何处理这种情况 典型场景 一个由 8 11 个子项目组成的项目 具有一个父工件 项目和一个主要使用 声明其他项目作为模块的主项目 问题是所有项目 严格 只共享共同的依赖关系 例如testng loggin
  • WebStorm/PhpStorm 对 jsx 中的 React 属性(如 className)发出警告

    我无法删除反应代码中的以下警告 属性className这里是不允许的 PhpStorm 中的警告 未知的 HTML 标记属性无法设置为驼峰式 仅保存小写字母 并且关闭该复选框没有帮助 设置在Languages Frameworks gt J
  • Java基于枚举类型创建对象的方法

    我的班级是这样的 class X class Y extends X class Z extends X 我有每个子类 id class 的枚举 enum Type Y TYPE 1 Y class Z TYPE 2 Z class int