我应该在 DTO 中使用构建器模式吗?

2024-01-14

这可能是一个相当主观的问题,但我想知道更多的意见。我使用 Spring MVC 构建了 Rest API 服务,并实现了 DTO-域-实体模式。我想知道您对实施该法案有何看法建造者模式 https://en.wikipedia.org/wiki/Builder_pattern在 DTO 中,类似

public class UserResponseDTO
    extends AbstractResponseDTO {

    private String username;
    private Boolean enabled;

    public UserResponseDTO(String username, Boolean enabled) {
        this.username = username;
        this.enabled = enabled;
    }

    public String getUsername() {
        return this.username;
    }

    public Boolean getEnabled() {
        return this.enabled;
    }

    public static class Builder {

        private String username;
        private Boolean enabled;

        public void setUsername(String username) {
            this.username = username;
        }

        public void setEnabled(Boolean enabled) {
            this.enabled = enabled;
        }

        public UserResponseDTO build(){
            return new UserResponseDTO(username, enabled);
        }
    }
}

根据定义:

Builder 设计模式的目的是将复杂对象的构造与其表示分离。通过这样做,相同的构建过程可以创建不同的表示。

在我的大多数 DTO 案例中(不是说全部),我没有更复杂的对象要构建,例如本例。而且,老实说,如果我们谈论 DTO,我想不出任何构造复杂对象的例子。

构建器模式是有助于使不可变对象更易于使用并增加代码清晰度的模式之一。

构建器模式提供对象的不变性。然后,我们可以认为 DTO 是服务响应本身,不应更改,因为这是响应(至少我是这么想的)


所以你怎么看?我应该在 DTO 中使用这种模式吗(考虑到这种情况,可能是大多数情况,不满足复杂对象原则)?


我的简短回答是,这是一个偏好问题。如果您喜欢构建器模式的工作方式,请应用它。对于这么小的一个案例,我认为这都不重要。我个人的偏好是不要在这里使用 Builder,因为它似乎没有增加太多价值。

我的较长答案是,构建器模式旨在促进复杂对象的更轻松配置,而无需诉诸诸如伸缩构造函数之类的反模式。在这种情况下,在任何一种情况下都没有反模式;这两种选择都相对较小且有效。

不过,当我们谈论偏好时,我更喜欢使用流畅界面的构建器模式的修改版本;每个方法都返回 Builder 的实例,以便方法调用可以链接在一起(而不是在单独的行上)。这与您链接的文章中的 Java 示例类似。

我会将您的构建器修改为如下所示:

public static class Builder {

        private String username;
        private Boolean enabled;

        public Builder setUsername(String username) {
            this.username = username;
            return this; 
        }

        public Builder setEnabled(Boolean enabled) {
            this.enabled = enabled;
            return this;
        }

        public UserResponseDTO build(){
            return new UserResponseDTO(username, enabled);
        }
    }

因此,使用构建器看起来像这样:

UserResponseDTO ur = new Builder().setUsername("user").setEnabled(true).build();

再次强调,这只是个人喜好问题。

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

我应该在 DTO 中使用构建器模式吗? 的相关文章

  • HashMap不写入数据库

    我尝试在我的数据库中写入 但只写入发件人和消息 我不明白为什么会发生这种情况 我认为问题出在我使用 sendMessage 的地方 我认为问题是我没有什么可以做的读 写其他用户的主键 我在数据库中写入消息的活动 public class M
  • 添加动态数量的监听器(Spring JMS)

    我需要添加多个侦听器 如中所述application properties文件 就像下面这样 InTopics Sample QUT4 Sample T05 Sample T01 Sample JT7 注意 这个数字可以多一些 也可以少一些
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 如何让spring为JdbcMetadataStore创建相应的schema?

    我想使用此处描述的 jdbc 元数据存储 https docs spring io spring integration docs 5 2 0 BUILD SNAPSHOT reference html jdbc html jdbc met
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 无法加载或查找主类,可以在命令行中使用,但不能在 IDE 中使用[重复]

    这个问题在这里已经有答案了 在将其标记为重复之前 请先听我说完 我正在尝试使用 gradle 导入一个 java 项目 功能齐全 适用于所有其他笔记本电脑 没有问题 我的项目 100 正常运行 适用于所有其他笔记本电脑 当我的笔记本电脑被重
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或

随机推荐

  • 从 r 中的另一个数据帧查找值

    我有一个名为的大数据框df以及一些身份证件 我有另一个数据框 id list 以及一组匹配的 ID 及其每个 ID 的关联特征 两个数据帧中的 ID 均未按顺序排序 实际上我想从更大的数据框中查找df to the id list并添加两列
  • 获取 C# 方法体内使用的类型

    有没有办法获取 C 方法中使用的所有类型 例如 public int foo string str Bar bar new Bar string x test TEST t bar GetTEST 将返回 条形图 字符串和测试 我现在能得到
  • 在事件中使用 Context/Toast 时出现不需要的重组 - Jetpack Compose

    在 Jetpack Compose 应用程序中 我有两个与此处类似的可组合项 Composable fun Main println Composed Main val context LocalContext current var te
  • 将 Octave 转换为使用 CuBLAS

    我想将 Octave 转换为使用 CuBLAS 进行矩阵乘法 该视频似乎表明这就像输入 28 个字符一样简单 使用 CUDA 库加速应用程序 http youtu be P2Ew4Ljyi6Y t 1m59s 实际上 情况比这更复杂一些 有
  • 无符号和有符号比较

    这是非常简单的代码 include
  • 如何监控Event Dispatch Thread队列?

    我有一个繁重的java项目 它无法响应用户 我发现事件调度线程中需要很长时间的事件会导致我的项目运行缓慢 所以 我有两个问题 如何监视事件调度线程并查看队列中的事件以及最终哪些事件在事件调度线程中花费更多时间 如您所知 invokeLate
  • 为什么我应该在 Perl 中使用 Carp 而不是 warn ?

    人们总是给我举鲤鱼的例子 而不是警告我 为什么 是什么让鲤鱼比警告更好 carp 为您提供有关消息来源的更多信息 上下文 usr bin perl use Carp foo bar baz sub foo warn foo sub bar
  • ios6 和 ios7 之间不同的垂直对齐字体

    我对 iOS6 和 iOS7 之间的垂直对齐字体有一些问题 我有一个自定义字体 在 iOS6 中比垂直对齐的中心高一点 UIButton 那么我做到了吗 我已经设置了myButton titleEdgeInsets UIEdgeInsets
  • Jackson无法反序列化(Spring Cloud Stream Kafka)

    我试图从 kafka 读取 json 消息并收到异常 该异常表示 Jackson 无法将 json 反序列化为 POJO json就像 code 500 count 22 from 1528343820000 to 152834388000
  • 如何让(1 << 9)通过MISRA? [复制]

    这个问题在这里已经有答案了 我们使用 Parasoft 静态分析并打开 MISRA C 2004 检查器 该软件是一个嵌入式系统 我们喜欢这样描述常量 1 define MOTOR ON 1 lt lt 9 这表明寄存器中的第 9 位应该是
  • 在 Laravel 中使用 Eloquent 多态关系对数据进行分类

    在我的应用程序中 我有一个类别表和多个表 包括需要分类的服务和文章 为了方便起见 我想对这些数据使用多态模型 创建类别供服务或文章使用 例如 一旦表被定义为服务表 它就不会显示为可添加文章的可能类别 这也适用于上市 我将有一个文章菜单和一个
  • 将多种日期时间格式转换为一种标准格式

    我正在尝试在 R 中执行一些简单的操作 在加载表后 我遇到了一个组合了多种格式的日期列 Date 1 28 14 6 43 PM 1 29 14 4 10 PM 1 30 14 12 09 PM 1 30 14 12 12 PM 02 03
  • 从 Django JSONField 获取值

    我正在尝试从模型中的 JSONField 检索值 但出现错误 Api 对象没有属性 openapi spec info title class Api models Model Model to hold infomation on the
  • 在 woocommerce 搜索中包含自定义字段值

    我尝试在 woocommerce 中包含自定义字段值search但我有一个问题 在 Google 和 Stack 上 我也看到了带有 pre get posts 的示例 所以我认为这是一个很好的方向 我编写了如下代码 function cu
  • MVC3 Html.DisplayFor -- 是否可以让该控件生成 ID?

    我希望能够显示一些文本 而且还可以通过 jQuery 修改文本 如果我使用 EditorFor 而不是 DisplayFor 我会看到输入控件的 ID 不过 我不希望该值以这种方式可编辑 因此 我将其设为 DisplayFor 但它不会为该
  • 类型必须满足静态生存期

    我正在尝试增加 Rust 和 GTK RS 应用程序的结构 但我不知道如何处理事件连接 我发现问题出在错误的生命周期中 但我真的不明白如何解决它 derive Debug struct CreatingProfileUI window gt
  • SQL 计数(*) 和非重复

    为什么我们不能使用count distinct 在 SQL 中 比如计算所有不同的行 select count from select distinct from MyTable as T 尽管我强烈建议您重新考虑使用的任何查询DISTIN
  • 是什么 ”?” php 中使用的 URL 中的符号?

    我是 PHP 新手 在学习PHP语言的过程中 我注意到 有些网站会出现这样的URL www website com profile php user roa3 我的问题 是什么 符号用于 如果我要开发一个 php 网站 我必须在 URL 中
  • 如何将 ImageMagick 环境变量传递给 nginx mongrels?

    我的 Rails 应用程序使用 ImageMagick 但应用程序在尝试执行 ImageMagick 命令 识别 时失败 我通过在 Apache 配置中传递以下环境变量解决了开发中的这个问题 我正在运行 Apache Passenger S
  • 我应该在 DTO 中使用构建器模式吗?

    这可能是一个相当主观的问题 但我想知道更多的意见 我使用 Spring MVC 构建了 Rest API 服务 并实现了 DTO 域 实体模式 我想知道您对实施该法案有何看法建造者模式 https en wikipedia org wiki