首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当只有一个参数时使用Dto vs Primitive

基础概念

DTO (Data Transfer Object):DTO是一种设计模式,用于在应用程序的各个层之间传输数据。它通常包含多个属性,用于封装数据,并且可以在不同的层之间传递。

Primitive:在编程中,原始数据类型(如int, double, boolean等)是最基本的数据类型,它们不是对象,不能包含其他数据。

优势

DTO的优势

  • 封装性:DTO可以封装多个相关的数据,使得数据传输更加结构化和易于管理。
  • 可扩展性:随着需求的变化,DTO可以轻松地添加或删除属性,而不会影响其他部分的代码。
  • 安全性:DTO可以用来隐藏实际的数据结构,只暴露必要的数据,从而提高系统的安全性。

Primitive的优势

  • 简单性:原始数据类型使用简单,直接赋值即可。
  • 性能:原始数据类型通常比对象更高效,因为它们不需要额外的内存开销。
  • 兼容性:原始数据类型在不同的编程语言和环境中都有很好的兼容性。

类型

DTO的类型

  • 简单DTO:只包含基本属性的DTO。
  • 复杂DTO:包含其他DTO或集合的DTO。

Primitive的类型

  • 基本原始类型:如int, double, boolean等。
  • 字符类型:如char。

应用场景

DTO的应用场景

  • 当需要在不同的层之间传输多个相关的数据时。
  • 当需要隐藏实际的数据结构,只暴露必要的数据时。
  • 当需要确保数据的一致性和完整性时。

Primitive的应用场景

  • 当只需要传输单个简单的数据值时。
  • 当对性能有较高要求时。
  • 当与其他系统或API交互时,这些系统或API期望接收原始数据类型。

问题及解决方法

问题:当只有一个参数时,是否应该使用DTO还是Primitive?

原因

  • 使用DTO可能会显得过于复杂,因为DTO通常用于封装多个属性。
  • 使用Primitive可能会更简单和高效,但如果后续需要扩展,可能会导致代码重构。

解决方法

  • 如果这个参数在未来可能会扩展为多个相关的属性,建议使用DTO。
  • 如果这个参数只是一个简单的值,并且不会扩展,使用Primitive会更合适。

示例代码

代码语言:txt
复制
// 使用DTO
public class UserDto {
    private String name;

    // Getter and Setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

// 使用Primitive
public void printUserName(String name) {
    System.out.println("User Name: " + name);
}

参考链接

通过以上分析,可以根据具体的需求和未来的扩展性来决定是使用DTO还是Primitive。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++核心准则R.30: 只有在包含明确的生命周期语义使用智能指针作参数

R.30: Take smart pointers as parameters only to explicitly express lifetime semantics R.30: 只有在包含明确的生命周期语义使用智能指针作参数...如果一个函数只是需要一个部件本身,接受一个智能指针作参数是错误的。它应该可以接受所有部件对象,而不只是一个生命周期被按照特定方法管理的对象。不需要管理生命周期的函数应该使用原始的指针和引用。...(简单)如果一个函数使用了可拷贝的(重载了操作符->和操作符*的)智能指针类型的参数但是只是调用了运算符*、->或者get(),发出警告并建议使用T*或者T&。...标记定义了(重载了操作符->和操作符*的)可拷贝/可移动智能指针类型的参数,但在函数体中却从未使用拷贝和移动功能,指针从未被修改也没有交给一个会那么做的函数的情况。那意味着所有权语义根本没有被使用。...建议使用T*或者T&。

58120
  • 常见问题之Golang——在for循环内使用go func进行使用参数总是使用最后一个对象

    常见问题之Golang——在for循环内使用go func进行使用参数总是使用最后一个对象 背景 日常我们开发,会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列...开发环境 系统:windows10 语言:Golang golang版本:1.17 内容 错误 在for循环内使用go func进行使用参数总是使用最后一个对象 造成原因: 由于go func 在创建协程使用的...apiServerAddr采用引用方式造成for循环一定次数后造成内容被覆盖,因此会出现引用同一个存储值的问题 解决方案: 使用一个新的对象来进行存储go func中方法使用参数,例如: for i,...demo := range demoList{ go func(de string) { test(de ) }(demo ) } 这里使用de作为一个新的变量来进行存储每次循环下的...demo值,这时就是产生了一个新的内存单元,在其堆栈中使用了新分配,后续循环过程中demo引用的内存地址发生了变更也不会影响到go func中之前已经创建好的协程参数,这样就可以有效避免本次的问题。

    1.2K20

    轻松高效玩转DTO(Data Transfer Object)

    Dozer Dozer 是 Java Bean 到 Java Bean 映射器,它以递归方式将数据从一个对象复制到另一个对象。 通常,这些 Java Bean 将具有不同的复杂类型。...支持的数据类型转换(双向) Primitive to Primitive Wrapper Primitive to Custom Wrapper Primitive Wrapper to Primitive...Wrapper Primitive to Primitive Complex Type to Complex Type String to Primitive String to Primitive...同时看官网 Release 版本,Dozer 现已支持 proto 类型的转换的支持,即支持 gRPC; 总结 Dozer 可以高效的处理我们日常 DTO 业务,一次 mapping 定义,多处使用,...Reader View 源码和文档更配,当我们阅读文档,我们需要一个友好的或专注的阅读模式,这样让我们思想更加集中,心无旁骛。

    2.2K20

    Dozer数据对象转换神器

    一个分层的体系结构中,经常会使用DTO、PO、VO等封装数据,封装数据到特定的数据对象中,然而在很多情况下,某层内部的数据是不允许传递到其它层,不允许对外暴露的,特别是在分布式的系统中,内部服务的数据对外暴露...所以,急需要使用一个通用的映射工具,通过配置或少量的编码就可以轻松的实现数据对象之间的转换,Dozer就是这样的映射工具,它具有通用性,灵活性,可重用性和可配置等特点,并且是开源的。..., compile "net.sf.dozer:dozer:5.5.1" 现有一个UserDTO、一个UserVO,需要将DTO中的数据转换到VO中,具体的代码如下: public class UserVO...同时,需要注意的是,在实际应用中不建议每次都创建一个新Mapper的实例,一个系统只需要有一个DozerBeanMapper实例。...to Primitive Wrapper Primitive to Custom Wrapper Primitive Wrapper to Primitive Wrapper Primitive to

    1.1K40

    带你见个新朋友,轻松掌握DTO(Data Transfer Object)

    DozerDozer 是 Java Bean 到 Java Bean 映射器,它以递归方式将数据从一个对象复制到另一个对象。 通常,这些 Java Bean 将具有不同的复杂类型。...StudentVo.class, TypeMappingOptions.wildcard(false)) .fields("address", "addr"); 重新运行 用例1的测试方法 ,运行结果(只有地址做了映射...支持的数据类型转换(双向) Primitive to Primitive Wrapper Primitive to Custom Wrapper Primitive Wrapper to Primitive...Wrapper Primitive to Primitive Complex Type to Complex Type String to Primitive String to Primitive...同时看官网 Release 版本,Dozer 现已支持 proto 类型的转换的支持,即支持 gRPC; 总结 Dozer 可以高效的处理我们日常 DTO 业务,一次 mapping 定义,多处使用,

    48620

    S7-1500调用一个功能块,应该使用整个结构代替大量的单个元素来传递参数

    在传送数据块的变量,符号名不再可用。 在 STEP 7 TIA 博途中的步骤 在 STEP 7 (TIA 博途) 中也可以传送结构体参数。...推荐使用结构变量作为 PLC 数据类型,由于其可以反复使用及统一修改。这样使编程更加简单。 用结构型 PLC 数据类型创建一个数据记录并给其一个变量名,例如 "Machine data"。...使用这个数据类型来声明一个数据块或者 DB 块中的变量。 在块的接口中定义 VAR_IN_OUT 类型的形参。 对于块调用可以参数化整个数据记录(DB 或者 DB 中的变量)作为一个参数。...优势 通过减少了大量的参数从而简化了调用接口 由于数据处理直接在数据记录中进行而节省了存储空间 没有额外的大量拷贝,提高系统性能 同时优化了数据块的访问 图 01 显示了如何使用两个 DB 块的变量调用和参数化功能块...拷贝数据结构, 在系统中填充位会被插入到数据传输中,因为UDT在系统中总是以16位存在。这会导致您在程序中使用非优化访问的块整个输出字将会被覆盖。输入和输出区域没有被优化。

    1.2K10

    Best practice on when to use the wrapper class and primitive type in Java

    类的一个很好的用途是作为泛型类型(包括Collection类,比如list和map),或者当你想要将它们转化为其他类型而不进行隐式转换(例如 Intege类具有方法 doubleValue() or...因此,最佳实践是能使用primitive的都用primitive,除非你正在处理泛型(确保你知道 autoboxing 和 unboxing) 使用 primitive 在以下几种情况下使用 primitive...使用 primitive 可以避免一些错误 如果不了解 wrapper class 中的一些机制,会遇到一些莫名其妙的问题 莫名其妙的 NullPointException Integer getValue...使用 wrapper class 使用泛型的时候必须使用 wrapper class,因为Java不支持使用基本类型作为类型参数 List list; // 编译器会提示:Type argument...wrapper class and primitive type When to use primitive vs class in Java?

    77731

    还在用BeanUtils拷贝对象?MapStruct才是王者!【附源码】

    在 mapper 中定义一个 vo 转为 dto 的方法 CarDto carVoToCarDto(CarVo carVo); 不加 uses 属性,查看编译后生成的实现类 public CarDto...source:属性的源名称, 如果带注释的方法有多个源参数,则属性名称必须使用参数名称限定,例如“addressParam.city"; 找不到匹配的属性,MapStruct 将查找匹配的参数名称;...constant:设置指定目标属性的常量字符串,指定的目标属性的类型为:primitive 或 boxed(例如 Long),MapStruct 检查是否可以将该 primitive 作为有效的文本分配给...primitive 或 boxed 类型。...如果你仅是在日常处理少量的对象,选取哪个其实变得并不重要,但数据量大建议还是使用 MapStruct 或 BeanCopier 的方式,提高接口性能。

    2K20

    【TypeScript 演化史 — 第九章】object 类型 和 字符串索引签名类型的点属性

    例如,object.create() 和 object.setprototypeof() 方法现的参数类型是 object | null interface ObjectConstructor {...它描述了一个本身没有成员的对象。...咱们试图访问此类对象上的任意属性,TypeScript 会提示编译错误 // Type {} const obj = {}; // Error: 类型“{}”上不存在属性“prop” obj.prop...在类型使用使用.符号访问未知属性仍然是一个错误,因此,对于以下代码,TypeScript 2.2 仍然会给出一个编译错误: const portNumbers = {}; // OK portNumbers...在 JS 中访问属性,大多数时候将使用点表示法,但也可以使用括号表示法作为转义。 有了这个较松的限制,对于常用JS 开发的人员来说更容易使用

    1.5K30

    Java分层领域模型使用解读

    使用不同的分层领域模型能够让程序更加健壮、更容易拓展,可以降低系统各层的耦合度。 分层模型的优势只有在系统较大才体现得更加明显。...不同业务使用不同的模型,一个业务发生变更需要修改字段,不需要考虑对其它业务的影响,如果使用一个对象则可能因为 “不敢乱改” 而产生很多不优雅的兼容性行为。...如果我们不愿意定义 Param 对象,使用 Map 来接收前端的参数,获取如果采用 JSON 反序列化,则可能出现上一节所讲到的反序列化类型丢失问题。...另外即使同一个接口,但是一个对内使用一个对外暴露,尽量使用不同接口,定义不同的参数和返回值,从而避免因为修改内部或外部的数据结构而导致另外一个受到影响,这也是单一职责原则的要求。...单一职责原则:一个类应该有且只有一个改变的理由。 也有部分团队 RPC 的请求和响应参数都通过 DTO 来承载,通过 XXRequestDTO 和 XXResponseDTO 来表示。

    54520

    DDD这样落地

    本想搞场chat,可失败了,那就失败吧,也许现在DDD的热度凉了,眼球都到低代码了,对于低代码,我现在只有使用权,还没有发言权,也许明年能写写 DDD意义 每种理论的诞生都是站在前人的基础之上,总得要解决一些痛点...对于事务脚本式也有模型,单只有数据模型,而没有对象模型。模型是对业务的表达,没有了业务表达能力的代码,人怎么能读懂 而DDD在领域模型方式就有很强的表达能力,当然在编码也不会以数据流向为指导。...dto中2.相对SRP,更大的问题是业务语义不明确,DDD中一个优势就是要业务语义显示化 怎么解决呢?...Domain Primitive,既能保证意图的正确性,又能让application service代码清爽 而出参,则使用DTO,如果有异常情况则直接抛出异常,如果不需要特殊处理,由interface...为了隔离领域模型与外部设备,同样需要为它们定义抽象的出口端口,这些出口端口该放在哪里呢 按此划分module,这些出口端口都放在了infra层,domain需要外部服务,不得不依赖infra module

    1.6K61

    【TypeScript 演化史 -- 9】object 类型 和 字符串索引签名类型的点属性

    例如,object.create() 和 object.setprototypeof() 方法现的参数类型是 object | null interface ObjectConstructor {...(o: object | null): any; setPrototypeOf(o: any, proto: object | null): any; // ... } 将基本类型的值作为参数传递给...咱们试图访问此类对象上的任意属性,TypeScript 会提示编译错误 // Type {} const obj = {}; // Error: 类型“{}”上不存在属性“prop” obj.prop...在类型使用使用.符号访问未知属性仍然是一个错误,因此,对于以下代码,TypeScript 2.2 仍然会给出一个编译错误: const portNumbers = {}; // OK portNumbers...在 JS 中访问属性,大多数时候将使用点表示法,但也可以使用括号表示法作为转义。 有了这个较松的限制,对于常用JS 开发的人员来说更容易使用

    1.3K10

    dotNET Core 3.X 使用 Web API

    环境 操作系统:Mac IDE:Rider dotNET Core:3.1 创建项目 如果是 Windows 操作系统当然是首选 VS2019 ,在 Mac 中虽然也有 VS2019 For Mac,但还是感觉...推断参数绑定源 之前需要在参数上添加 [FromBody]、[FromQuery]等特性,现在可以去掉这些特性,系统会自动推断参数的来源,比如:如果一个参数在 Route 里面定义了,会自动从先从Path...错误状态码详细信息 之前的版本中,如果接口返回一个 BadRequest,是没有内容的,只有状态码,如下: ? 加上 [ApiController] 特性后,结果如下: ?...ContentTypes = { "application/problem+json" } }; }; }); 出现验证问题...view=aspnetcore-3.1 数据塑形 在 API 中返回结果到前端,一般不会直接将底层的 Entity 返回,会创建相对应的 Dto,比如,用户的 Entity 是这样的 public class

    1.6K30

    Export大数据量导出和打包

    项目需求 导出生成大批量数据的文件,一个Excel中最多存有五十万条数据,查询多余五十万的数据写多个Excel中。...大数据量文件一般采用异步生成文件,导出首先授权生成一个流水号,而后将数据携带流水号请求导出接口。 抛开实际业务,做成一个比较公共的导出功能。...主要代码 逻辑说明: 导出前将请求参数更新到导出记录中。 类加载器加载需要导出数据的实体类 设置一个数据量指针,记录到每个文件的数据量 达到阈值指定文件写出到磁盘并清缓。...()); //合并文件到导出文件记录主表 //只有一个文件记录直接更新主表文件地址 List recordList...,使用aop在申请流水号时计数器+1,导出完成或者异常队列计数器-1。

    59230

    Clean Code系列之DDD分层参数转换

    controller的LoginRequest参数,会在TService中失效。在实现层面,LoginRequest本质上就是个DTO,传输数据。...而且不再像过去原始servlet,传输数据时会有很多原生API类型,现在的框架都进化了,request对象中只有业务属性。...测试代码,controller的测试与service的测试是一致的,use case是相同的。...2、代码复用 比如创建文章,编辑文章,两者入参差不多,只是创建没有id,而编辑时有id,从代码复用角度,不想类的膨胀,DTO只创建一个。会出现一个dto会有很多很多的属性。...应对策略: 大到一个微服务,小到一个变量,SRP原则无处不在。 DTO属性要明确简单,业务对象要语义清晰显现化。

    87720

    DDD分层

    调度层收到用户接口层的请求后,委托Context层与本次业务相关的上下文进行处理 Domain层是领域层,定义领域模型,不仅包括领域对象及其之间关系的建模,还包括对象的角色role的显式建模 Infrastructure...-- 启动入口及test --> start 入口模块 包结构: start 只有一个启动类 test 单元测试 除了启动类,还有单元测试 generator-assist-dao...生成的dao类 包结构: repository model 与数据库对应的实体类 repository mapper mybatis的mapper 现在实践落地,这个模块是个空模块,why?...但在落地,domain与infra出现了循环依赖,COLA把实现放在了app层,这样有些另类,所以暂时先把repository全部放在了service层 迷思: 1、基于mybatis的实现,mapper...assist-infrastructure 基础设施层 包结构 config 配置信息 adapter 外部调用封装 clients 外部调用实现 pl 服务接口的契约 published language dp domain primitive

    2.4K20

    如何获取Device DNA

    Device DNA是非易失的,不可更改的,换言之,它只有只读属性。那么如何获取这个DNA呢?...(这里以UltraScale系列芯片为例) 方法1:通过Primitive DNA_PORTE2 DNA_PORTE2是一个Primitive,和其他Primitive一样,可直接在代码中实例化,其端口如下图所示...READ有效(高有效,且至少持续一个时钟周期),96bit DNA信息将被同时加载到一个移位寄存器中,如下图所示(图片来源:Figure 8-2,ug570)。...SHIFT有效且READ无效,移位寄存器开始在SHIFT的控制下进行移位操作,最先从DOUT输出的是DNA的最低位。 ?...该Primitive提供了一个仿真值,由参数SIM_DNA_VALUE确定,这有助于我们通过仿真来分析READ和SHIFT的时序关系。 ? 仿真结果如下图所示。

    1.5K30
    领券