Java Builder 模式和“深”对象层次结构

2024-06-28

在“深层”对象层次结构中使用生成器模式的最佳实践是什么?为了详细说明,我探索了将 Joshua Bloch 提出的 Builder 模式应用到我的 XML 绑定代码的想法(我使用的是 SimpleXML,但这个问题适用于任何情况)。我的对象层次结构有 4 层深,具有不同程度的复杂性。我的意思是,在某些关卡中,我的对象只有几个属性,而在其他一些关卡中,我的对象最多有 10 个属性。

因此,请考虑这个假设的示例(为了简洁起见,我省略了简单 XML 注释)

public class Outermost {

    private String title;
    private int channel;
    private List<Middle> middleList;

}

class Middle{
    private int id;
    private String name;
    private boolean senior;
    /* ... ... 10 such properties */

    private Innermost inner;
}

class Innermost{
    private String something;
    private int foo;
    /* ... Few more of these ..*/
}

如果我想强制创建Outermost使用构建器的对象,最好的方法是什么?最明显的答案是inner static Builder上述每个类别的类别。

但是,这不会让事情变得像构建器模式试图解决的问题一样难以处理吗?我正在考虑类似的事情 - 这将强制实施“由内而外”的方法 - 意味着Innermost对象必须先完全构造并实例化,然后才能添加到Middle目的。但我们都知道,在实践中(尤其是在构建 XML 或 JSON 时),我们很少有“及时”信息来完成这一任务。

很有可能,我们最终会为所有级别的每个属性都设置变量;并在最后创建对象。或者,最终会在代码中出现多个级别的 Builder,从而增加混乱。

那么,关于如何优雅地实现这一点有什么想法吗?


建造者模式的描述here http://rwhansen.blogspot.com/2007/07/theres-builder-pattern-that-joshua.html我猜你指的是什么;它与维基百科中描述的模式有点不同here http://en.wikipedia.org/wiki/Builder_pattern,我更喜欢前者。

从我读到的描述中,我不认为您对构造顺序或封装损失不可避免的担忧。对我来说,最大的问题是原始数据的结构。

假设我们有

 public OuterBuilder {
     // some outer attributes here

     private ArrayList<MiddleBuilder> m_middleList;

     public OuterBuild( mandatory params for Outers ){
          // populate some outer attributes
          // create empty middle array
     }

     public addMiddle(MiddleBuilder middler) {
              m_middleList.add(middler);
     } 
 }

现在我们可以根据需要创建任意数量的 middleBuilder

 while (middleDataIter.hasNext() ) {
      MiddleData data = middleDateIter.next();
      // make a middle builder, add it.
 }

我们可以将相同的模式应用于更高级别的嵌套。

为了解决你的第一点,每个属性都有一个变量:取决于我们如何设计构建器以及我们的数据来自哪里。如果我们来自 UI,那么我们几乎每个属性都有一个变量,我们的情况也不会更糟。如果按照我上面的建议,我们正在迭代某些数据结构,那么构建器可能负责解释该数据结构。在我的示例中,我们向下传递 MiddleData 实例。一些额外的耦合,但它确实封装了细节。

为了解决你的第二点,我们不会边走边构建东西,而是有效地使用构建器作为数据的积累点。最终我们调用“Go and Build”方法,但此时我们应该拥有所有数据,以便构建整个层次结构。

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

Java Builder 模式和“深”对象层次结构 的相关文章

  • 记录所有 presto 查询

    如何将提交到 presto 集群的所有查询存储在文件 ORC 文件 或其他数据库中 目的是保存在 presto 工作线程上执行的所有查询的记录 我知道我需要覆盖 queryCompleted 方法 我也尝试遵循this https grou
  • Lucene 通过 URL 搜索

    我正在存储一个具有 URL 字段的文档 Document doc new Document doc add new Field url url Field Store YES Field Index NOT ANALYZED doc add
  • 使用 getIntent().getExtras().getString 时出现 nullpointerException

    我想将一个活动中的值传递给另一个活动并使用此代码 Intent i new Intent MainActivity this ListActivity class i putExtra position startActivity i 并在
  • 如何在 Eclipse EE (Java) 上配置 mySQL

    下载 Java EE Eclipse Indigo EE mysql 5 5 从现在起我不知道如何直接从 eclipse 创建 mySQL 数据库 我已经找到了使用 WAMP 服务器的方法 但我并不打算这样做 我相信第一步在于以某种方式使用
  • 如何删除 JComboBox 的“单击并查看下拉菜单”功能?

    我有一个 JComboBox 它使用 GlazedLists 添加预输入功能 我希望用户输入一个字符串并看到预先输入的内容 这要归功于 Glazedlists 但是 我不希望用户能够单击组合框的向下箭头并检查下拉列表 我已使向下箭头不可见并
  • 如何让appium测试在iOS上运行得更快?

    目前 我正在使用 appium 进行 iOS 应用程序测试 并且我已经在 mac mini 机器上用 Java 编写了测试 我正在使用 Jenkins CI 来运行我的测试 我想更快地运行我的测试 因为目前它在 iOS 模拟器上相当慢 例如
  • 在 Android 的视图中创建透明的圆形切口

    我正在尝试创建一个半透明的帮助叠加层 以便在用户首次打开应用程序时显示在我的活动的主屏幕上 我想通过 剪切 与按钮位置相对应的覆盖层部分来突出显示主布局中包含的按钮 并使用 setContentView 进行膨胀 并使剪切部分透明 覆盖层是
  • 协程内的具体化泛型参数不起作用

    我正在创建 http json 客户端 我将 Volley 与协程结合使用 我想创建通用的 http 客户端 这样我就可以在任何地方使用它 我创建了通用扩展方法来将 JSON 字符串解析为对象 inline fun
  • 如何将 Postgres inet 数据类型与 OpenJPA 结合使用?

    我需要使用 OpenJPA 2 2 2 在 Postgres 9 0 表中记录 IP 地址 我已经使用本机查询让它工作 EntityManager entityManager entityManagerFactory createEntit
  • 使用 PowerMock 和 Mockito 模拟 Logger 和 LoggerFactory

    我想模拟以下记录器 但要验证日志条目是否被调用 而不是内容 private static Logger logger LoggerFactory getLogger GoodbyeController class 我想模拟用于 Logger
  • Java在多显示器环境下获取鼠标位置

    我在互联网上搜索了一段时间 但没有找到任何解决我的问题的方法 我知道你可以通过以下方式获取当前鼠标位置 PointerInfo a MouseInfo getPointerInfo Point b a getLocation 问题是在多环境
  • Java 中 getter 的命名约定有多重要?

    我非常相信一致性 因此也相信惯例 然而 我目前正在用 Java 开发一个框架 其中这些约定 特别是get set前缀约定 似乎妨碍了可读性 例如 有些课程会有id and name属性和使用o getId 代替o id 由于多种原因 这似乎
  • 如何在 JRuby 中初始化 SQLite3 JDBC 驱动程序?

    如何在不使用活动记录的情况下通过 JDBC 访问 SQLite3 下面是一个使用 JRuby 1 6 6 Ruby 1 8 兼容模式 和 jdbc sqlite3 3 7 2 的示例 require rubygems require jdb
  • 无法在 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
  • 如何对文本文件执行二分搜索

    我有一个大文本文件 5Mb 我在 Android 应用程序中使用它 我将文件创建为预先排序的字符串列表 并且文件一旦创建就不会更改 如何对此文件的内容执行二分搜索 而不需要逐行读取来查找匹配的字符串 由于文件的内容不会改变 因此您可以将文件
  • 获取Java InputStream后面的文件的字节数

    正如标题所示 我需要知道文件在输入流 后面 有多少字节 我不想下载所有字节和计数 需要很长时间 我只需要知道文件有多少字节 像这样 int numberOfBytes countBytes inputStream 所以 我需要 countB
  • 如何使用鼠标指针和键盘快捷键捕获文本?

    我想使用 C 或 java 使用鼠标指针和键盘快捷键从打开的窗口捕获文本 喜欢babylon http babylon com 所以 我需要知道什么以及如何实施 我需要使用哪些库 或者我可以使用 winapi 吗 使用脚本语言创建您想要执行
  • 如果没有发生触摸事件,Android SurfaceView 会变慢

    我正在制作一款游戏 除了游戏循环之外一切都很顺利 我正在使用 SurfaceView 并绘制 2D Sprites 位图 目前游戏是一艘穿过小行星带的飞船 飞船停留在屏幕中央 手机向任一方向倾斜以移动小行星 小行星改变位置而不是玩家 当旧的
  • 使用 == 比较 Long 对象类型和原始 int

    我有一个通过调用返回 Long 对象数据类型的方法 resp getResultCode 我想比较一下HttpStatus GONE value 它实际上只返回一个原始 int 值410 Long 会拆箱自身以正确地与 int 原语进行比较
  • Spring Boot数据休息中的日期问题

    当我处理日期时 我遇到了春季数据休息的问题 简而言之 就是推迟一天的日期 例如 如果我有 1111 11 11 它会返回给我 1111 11 10 SO 中有一些相关的帖子 ex1 https stackoverflow com quest

随机推荐

  • 在 Scala 中实现“.clone”

    我正在想办法 clone我自己的对象 在 Scala 中 这是为了模拟 因此可变状态是必须的 由此产生了克隆的全部需要 在提前模拟时间之前 我将克隆整个状态结构 这是我目前的尝试 abstract trait Cloneable A See
  • 如果没有 NULL 我们会做什么?

    我曾经读到过 拥有可空类型绝对是一种邪恶 我相信这是创造它们的人写的一篇文章 在艾达 我相信这是这篇文章 http qconlondon com london 2009 presentation Null References The Bi
  • 导出时的 Highcharts css 样式

    I have the following graph in digital See image but when using the Highchart s hamburguer CSS menu to export to PDF or J
  • java 允许使用函数式接口作为方法吗?

    有了新的 java lambda 和函数式接口的概念 是否可以将这些函数式接口视为方法 interface Func void execute int i void call Func f f 1 instead of f execute
  • 如何使用 Java 检测文件是否存在于 Google Drive 中(并且未被删除)?

    非常不言自明的标题 我正在使用适用于 Java 的 Google Drive Client Api 我目前拥有的内容如下 File f mService files get fileId execute 但是 我找不到该房产File用于检查
  • Android 日期选择器月份作为数字

    在 Android DatePicker 中 在某些操作系统中 月份显示为 Jan Feb Mar Dec 在其他操作系统中 月份显示为 1 2 3 12 有没有办法让它始终保持一致 以便它始终显示 1 2 3 12 作为月份 显示 1 2
  • 无法从innerHTML获取动态数据 - Angular

    我从我的视图或 HTML 中获取动态数据并将其放置在我的页面上 以便我可以查看所述数据的打印结果 我必须使用此方法 因为我正在使用此动态数据创建自己的打印页面 我使用的方法获取第一个初始值 而不是最新更新的 DOM 如果删除 innerHT
  • UIWebView webCore 在 iOS7.1 中崩溃(示例:www.latimes.com)

    当我打开 洛杉矶时报 www latimes com 时 我的 iOS 应用程序崩溃了 崩溃发生在 WebCore 的某个地方 但我不知道在哪里 使用 Zombie 或 leaks 进行分析不会针对此 EXE BAD ADDRESS 错误返
  • Symfony 3 - 自动序列化 DateTime 对象

    在我的项目中我有一些实体createdAt柱子 class Acme var DateTime ORM Column name created at type datetime protected createdAt 我已启用FOSRest
  • MySQL 中的 char / varchar / text / longtext 列是否在文件系统中占据完整大小,即使对于部分填充的单元格也是如此?

    MySQL 中的 varchar text longtext 列是否占据文件系统中的完整长度大小 即使对于不完整的单元格也是如此 参考这篇博客文章 http boolean co nz blog max length for mysql t
  • 跟踪代码的来源 (PHP)

    我正在浏览客户的服务器 运行疯狂的专有论坛 软件 vBulletin 甚至更糟糕的 SEO 模组 vbseo 我想不通 找出页面的 php 代码来自哪里 如何追踪这个 返回 PHP 页面的 URL http www example com
  • 64位Java无法通过ODBC访问32位MS Access数据库

    我有一台新的 64 位笔记本电脑 并安装了 STS 64 位和 Java 64 位 我正在尝试创建到 32 位 Microsoft 数据库的 ODBC 连接 但是默认的管理工具不提供访问驱动程序 经过谷歌搜索后 我发现 C Windows
  • 正则表达式“只分组,不捕获”似乎不起作用

    x abcdefg x x match ab cd ef x 不应该是 abef 吗 不是 它实际上是 abcdef 为什么我的 没有任何效果 当然我的理解很可能是错误的 still matches 它只是不会出于以下目的创建新组 1 1
  • JQGrid 列自动宽度

    我只是想知道如何将 jqGrid 列宽度设置为自动 colModel name MyDescription index description align left width 150 sortable false 对于上面的语句 我如何指
  • 如何对 Sharepoint 工作流程进行故障排除?

    我在这里有点迷失 找不到太多文档 NET 工作流程还是使用 SharePoint 设计器创建的工作流程 我只获得了后者的经验 而且它们并不容易调试 您实际上只需要一次执行一步并测试每一步 当您转到 列表设置 时 您也可以在 SharePoi
  • mysql字符串转换返回0

    why select aaa 0返回 1 真 如果我有一张像这样的桌子 userid pass user1 pas1 如果我查询 select from table where userid 0 and pass 0 它给了我所有的行 My
  • Scala变量作用域问题

    我有一个 scala 语法问题 假设我有一个简单的依赖模式构造 如下所示 trait Master val foobar object SubObject extends SubObject foobar foobar trait SubO
  • MySQL 设置自动增量“Ad Hoc”

    有没有办法以 临时 方式将 mysql 的 auto increment 设置为某个整数 例如 表中已删除 N 个最新行 因此主键 auto increment 与实际行数相差 N 有没有办法将 auto increment 设置为正确的数
  • 对于 ActiveReord 中的 has_many 关联,counter_cache 不会递减

    我的 Rails 3 应用程序有 2 个模型 第三个模型是它们之间的联接表及其 has many 关系 基本上 User 和 Show 通过 SavedShow 连接起来 允许用户保存节目列表 class Show lt ActiveRec
  • Java Builder 模式和“深”对象层次结构

    在 深层 对象层次结构中使用生成器模式的最佳实践是什么 为了详细说明 我探索了将 Joshua Bloch 提出的 Builder 模式应用到我的 XML 绑定代码的想法 我使用的是 SimpleXML 但这个问题适用于任何情况 我的对象层