JAVA实体需要加@Builder吗(构建器模式)

server/2024/9/29 22:07:27/

对于JAVA中两种设置属性值的方式有什么区别,这里做下记录

问题一:JAVA实体什么时候需要加@Builder?
在Java中,@Builder 注解通常用于简化创建对象时构造函数的调用。当你有一个实体类(Entity)或数据传输对象(DTO)拥有多个字段,并且你希望以一种更简洁的方式创建其实例时,@Builder 注解就显得非常有用。特别是当使用构造器或setter方法逐个设置字段值显得冗长或容易出错时。

问题二:加上@Builder的作用是什么?
加上@Builder注解的作用是为你的类自动生成一个构建器(Builder)类。这个构建器类提供了一种链式调用的方式来设置对象的属性,并最终通过调用.build()方法来创建对象实例。这种方式使得对象创建更加简洁和易于阅读,特别是在对象有多个属性需要设置时。

问题三:加上@Builder之后,同时也加上@Data注解的话,还能通过new User()对象后,对象.set()方法来设置属性吗?
是的,你可以同时使用@Builder和@Data注解。@Data注解来自于Lombok库,它会自动为你的类生成getter、setter、equals()、hashCode()和toString()方法。这意味着,即使你使用了@Builder注解,你的类仍然会拥有传统的setter方法。

因此,你可以通过new User()创建对象后,使用.set()方法来设置属性,或者你也可以使用构建器模式来创建和设置对象。

@Builder的使用示例

java">import lombok.Builder;  
import lombok.Data;  @Data  
@Builder  
public class User {  private String name;  private int age;  private String email;  // 这里不需要显式编写getter、setter方法,Lombok会为我们自动生成  public static void main(String[] args) {  // 使用构建器模式创建对象  User user1 = User.builder()  .name("Alice")  .age(30)  .email("alice@example.com")  .build();  // 使用传统的setter方法创建并设置对象  User user2 = new User();  user2.setName("Bob");  user2.setAge(25);  user2.setEmail("bob@example.com");  // 验证对象是否按预期设置  System.out.println(user1);  System.out.println(user2);  }  
}

其中 使用了构建器模式来创建并设置user1的属性。然后,我们使用传统的setter方法来创建并设置user2的属性;在日常开发中,使用那种模式,依赖于关注的重点在哪。

问题:那具体什么时候用普通的对象setter来设置属性值,什么时候使用@Builder的链式调用来设置属性值?

使用普通的对象setter来设置属性值

  • 当对象创建后需要逐步构建时:如果你在一个较长的过程中逐步构建对象,并且可能需要根据条件设置不同的属性,那么使用setter方法可能更灵活。
  • 当需要重用已创建的对象时:如果你已经创建了一个对象实例,并且稍后需要修改其属性,那么setter方法显然是必需的。
  • 当与遗留代码或第三方库交互时:如果你的代码需要与不使用Lombok或构建器模式的遗留代码或第三方库交互,那么使用setter方法可能更兼容。
  • 当需要更细粒度的控制时:在某些情况下,你可能需要在设置属性之前或之后执行额外的逻辑(如验证、计算等)。在这种情况下,自定义的setter方法提供了更多的控制。

使用@Builder的链式调用来设置属性值

  • 当对象创建时所有属性都需要设置:如果你的对象在创建时就需要设置所有或大部分属性,并且这些属性在对象生命周期内不会改变(或很少改变),那么使用构建器模式可能更清晰、更简洁。
  • 当需要提高代码可读性时:构建器模式的链式调用可以创建出非常流畅和易于阅读的代码,特别是在设置多个属性时。
  • 当与Lombok或其他现代Java库集成时:如果你的项目已经在使用Lombok或其他现代Java库,并且你希望利用它们提供的便利功能(如自动生成getter、setter、构建器等),那么使用@Builder注解是一个很好的选择。
  • 当需要避免在构造函数中传递大量参数时:如果你的对象有很多属性,并且你希望避免在构造函数中传递大量参数(这可能会导致构造函数难以阅读和维护),那么使用构建器模式可能是一个更好的选择。

http://www.ppmy.cn/server/124673.html

相关文章

Spring是什么

Spring是一个轻量级的开源的J2EE框架。它是一个容器框架,用来装javabean(java对象),中间层框架(万能胶)可以起一个连接作用,比如说把Struts和Hibernate粘合在一起运用,可以让我们的企业开发更快、更简活。 Spring是一个轻量级的控…

c# 子类继承父类接口问题

在C#中,子类并不直接“继承”父类继承的接口,但子类的确会继承父类对接口的实现(如果父类实现了该接口)。这里有一些关键的概念需要澄清: 接口继承:当一个类实现了某个接口时,它必须实现接口中…

828华为云征文 | 使用Flexus X实例搭建Dubbo-Admin服务

一、Flexus X实例简介 华为云推出的Flexus云服务,作为专为中小企业及开发者设计的新一代云服务产品,以其开箱即用、体验卓越及高性价比而著称。其中的Flexus云服务器X实例,更是针对柔性算力需求量身打造,能够智能适应业务负载变化…

基于SpringBoot校园失物招领系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 本课题的作用、意义,在国内外的研究现状和发展趋势,尚待研究的问题 作用:本课题的目的是使失物招领信息管理清晰化,透明化,便于操作,易于管理。通过功能模…

探索 Midjourney 中文版:开启人工智能绘画新征程

Midjourney 中文版是专门为中国创作者精心打造的人工智能绘画神器。它打破了语言的壁垒,以熟悉的中文界面和指令输入方式,让每一个怀揣创意梦想的人都能轻松驾驭。无需再为复杂的英文指令而苦恼,在这里,你只需用中文表达心中的想象…

docker build 有时候不展示命令的输出情况,怎么办?

来源:https://stackoverflow.com/questions/64804749/why-is-docker-build-not-showing-any-output-from-commands docker build 有时候不展示命令的输出情况,不方便我们 debug,怎么办? 可以加上 docker build --progressplain …

封装轮播图 (因为基于微博小程序,语法可能有些出入,如需使用需改标签)

这是在组件中使用&#xff0c;基于微博语法 <template><wbx-view class"" style"width: 100vw;height: 70vh;"><WBXswiper change"gaibian" :vertical"false" :current"current" indicatorActiveColor"…

Vue3学习(六)Vue3 + ts几种写法

前言 官网提到组合式api和选项式api 选项式api其实就是vue2的写法&#xff0c;组合式api是vue3的新写法&#xff08;组合式api可以在script中使用setup&#xff08;&#xff09;也可以使用<script setup>&#xff0c;<script setup>是setup&#xff08;&#xff…