【问题标题】:Java bean: Fastest way to implement an iterator of elements?Java bean:实现元素迭代器的最快方法?
【发布时间】:2014-02-05 12:21:27
【问题描述】:

我有一个沼泽标准 Java bean,MyJavaBean。假设它有 50 个变量,我用 eclipse 生成了 50 个 getter 和 50 个 setter。

这个 bean 由一些业务逻辑的装配线填充,现在我想遍历所有 50 个元素。例如,实现一个 to-string 方法。自然我不想调用每个 getter 方法。

现在有一些明显但很长的方法:

  • 实现 bean,以便在运行过程中保持其元素集合保持最新状态,然后为此编写一个 getter

  • 通过将每个元素添加到集合并返回该集合来手动实现迭代器

所以我有两个问题:

  • 如果我有一个包含 50 个元素的 bean,我是否已经犯了错误?这是一种消极的模式吗?

  • 我怎样才能以更聪明的方式做到这一点?是否有一些库会返回给定 JavaBean 的元素集合,使用反射或类似的东西?

【问题讨论】:

  • 所以基本上你想要你的 javabean 的通用 toString 方法对吗?
  • 我想要一个用于 javabean 中变量的通用迭代器。实现一个通用的 toString 只是一个示例用例。

标签: java collections javabeans


【解决方案1】:

如果您的类是 JavaBean,我建议不要直接访问这些字段,而是使用 JavaBeans / BeanInfo 机制。您可以通过直接使用 Introspector 或通过像 Apache Commons / BeanUtilsSpring's BeanWrapper 抽象这样的帮助程序库来做到这一点。

查看我以前的答案以供参考:

Java Reflection: How can i get the all getter methods of a java class and invoke them

【讨论】:

  • 就运行时间而言,这可能不是最快的,但就实现时间而言。
  • @SpaceTrucker 像往常一样,在优化之前,找出你是否真的有瓶颈(通过分析等)。在确定瓶颈之前,不妨使用高级方法
  • 为了完整起见,我最后使用的解决方案是: Map properties = BeanUtils.describe(MyJavaBean); List list = new ArrayList(properties.values()); for(Object obj : list) { /*我的逻辑*/ }
【解决方案2】:

它确实闻起来像一种反模式。如果您的类只包含数据,而没有业务逻辑,那么您最好实现基于 HashMap 的数据结构,尤其是在数据字段将来可能发生变化的情况下。但是,如果不了解您的项目要求,就很难说清楚。

您始终可以使用 reflection 遍历普通旧 Java 类的字段。

特别是,使用Class.getFields 方法来确定给定类的字段:

字段[] 字段 = MyJavaBean.class.getFields(); 对于(字段字段:字段) { System.out.println("字段:" + field.getName()); }

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2023-03-14
    • 2018-04-05
    • 2021-04-20
    • 1970-01-01
    • 2013-12-04
    • 2012-11-14
    • 2019-04-08
    相关资源
    最近更新 更多