深入理解Java中@Accessors和@Builder

 更新时间:2023年08月20日 10:15:22   作者:Owen Guo  
本文主要介绍了@Accessors和@Builder使用,区别与坑,对使用这两个注解的有一定的帮助,具有一定的参考价值,感兴趣的可以了解一下

@Accessors和@Builder

@Accessors(chain=true)

就是new一个对象后可以链式调用set给属性赋值。

@Data
@Accessors(chain = true)
public class User {
    private String name;
    private Integer age;
    private Double weight;
    public static void main(String[] args) {
        User user = new User().setName("张三").setAge(18).setWeight(60.00);
        System.out.println(user);
    }
}

从上面的代码我们看到new User()后面可以链式调用set方法赋值。

这是因为@Accessors(chain=true)将lombok生成的setter方法返回值变为了this,也就是返回了对象本身,代替了原本的void。

@Builder

@Builer注解是基于建造者模式的链式操作。

@Data
@Builder
public class User {
    private String name;
    private Integer age;
    private Double weight;
    public static void main(String[] args) {
        User user = User.builder().name("张三").age(18).weight(60.00).build();
        System.out.println(user);
    }
}

我们能看到是先使用 bulder 方法后再链式操作,然后调用 build 方法返回。

原因是内部生成了构建起 UserBuilder ,调用 builder() 方法就是是创建 UserBuilder 对象,然后给 UserBuilder 对象赋值,最后通过 UserBuilder 对象的 build() 来生成 User 对象。

可以看编译后的class文件

@Accessors和@Builder的区别

其实我们看它们编译后的class文件就可以直到原因。 @Accessors 是将生成的 setter() 方法返回 this ,而 @Builder 是再对象内部创建一个构建器,通过这个构建器来最终创建对象。

@Builder 底层新建了一个对象,为了实现链式调用再创建一个对象感觉优点大材小用了。 @Accessors 再实现了链式调用的基础上,减少了多余对象的创建。

@Accessors和@Builder使用的坑

  • 在有的开源反射工具包对对象进行浅拷贝时,获取set方法原信息时会判断返回值是否为void,这样使用 @Accessors 注解就会报错。
  • @Builder 注解会给类默认生成全参构造,这样就没有了默认的无参构造,在Spring这类容器中默认调用无参构造就报错了,所以要加上 @NoArgsConstructor @AllArgsConstructor 注解

详细看看@Accessors注解

@Accessors的源码

可以看到它有四个属性, chian=true 就是可以链式调用,其他的下面我们来分别说明下。

@Accessors属性说明

fluent属性

fluent=true 时,setter和getter方法就没有set和get了,直接调用属性名即可

chain属性

chain=true 时,就可以链式调用setter方法给属性赋值了

makeFinal属性

makeFinal=true 时,生成的setter和getter方法都是final修饰的方法

final修饰的方法表示不能在子类中重写这些方法。

prefix属性

该属性添加一个数据,添加属性的前缀,表示忽略属性对应的前缀来生成setter和getter方法

如上图一样,属性赋值的时候就可以忽略前缀。

prefix属性的坑

1、如果属性的前缀和prefix写的前缀不匹配,那setter和getter方法就不会生成了。
2、属性的前缀后的第一个字母必须是大写,否则也不会生成setter和getter方法。
3、上面说的不会生成setter和getter方法是连不去前缀的都不会生成,相当于@Data注解失效了。

到此这篇关于深入理解Java中@Accessors和@Builder的文章就介绍到这了,更多相关Java中@Accessors和@Builder内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java将科学计数法数据转为字符串的实例

    Java将科学计数法数据转为字符串的实例

    下面小编就为大家带来一篇Java将科学计数法数据转为字符串的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Spring简明分析Bean作用域

    Spring简明分析Bean作用域

    scope用来声明容器中的对象所应该处的限定场景或者说该对象的存活时间,即容器在对象进入其 相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象,这篇文章主要介绍了Spring中的Bean作用域,需要的朋友可以参考下
    2022-07-07
  • Java string.trim()究竟去掉了什么

    Java string.trim()究竟去掉了什么

    这篇文章主要介绍了Java string.trim()究竟去掉了什么,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • spring调度注解@Scheduled方式(含分布式)

    spring调度注解@Scheduled方式(含分布式)

    文章介绍了Java中任务调度的几种常见方法,包括JDK原生的Timer、ScheduledThreadPoolExecutor和Spring的@Scheduled注解,文章还讨论了如何在分布式环境中实现任务调度,并介绍了一些开源的分布式任务调度解决方案,如Quartz和XXL-JOB
    2024-11-11
  • idea生成类注释和方法注释的正确方法(推荐)

    idea生成类注释和方法注释的正确方法(推荐)

    这篇文章主要介绍了idea生成类注释和方法注释的正确方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java的MyBatis框架中MyBatis Generator代码生成器的用法

    Java的MyBatis框架中MyBatis Generator代码生成器的用法

    这篇文章主要介绍了Java的MyBatis框架中Mybatis Generator代码生成器的用法,Mybatis Generator主要被用来生成繁琐的配置文件来提高效率,需要的朋友可以参考下
    2016-04-04
  • JPA中@ElementCollection使用示例详解

    JPA中@ElementCollection使用示例详解

    在JPA中,@ElementCollection注解主要用于映射集合属性,例如List、Set或数组等集合属性,以及Map结构的集合属性,每个属性值都有对应的key映射,这篇文章主要介绍了JPA中@ElementCollection使用,需要的朋友可以参考下
    2023-11-11
  • Java利用数组随机抽取幸运观众如何实现

    Java利用数组随机抽取幸运观众如何实现

    这篇文章主要介绍了Java利用数组随机抽取幸运观众如何实现,需要的朋友可以参考下
    2014-02-02
  • SpringBoot中集成串口通信的项目实践

    SpringBoot中集成串口通信的项目实践

    本文主要介绍了SpringBoot中集成串口通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • Java的application.yml文件的配置全过程

    Java的application.yml文件的配置全过程

    本文介绍了在Java项目中使用application.yml文件进行配置的方法,重点讲解了数据源、连接池、MyBatis、MyBatis-Plus和Redis的配置,同时,还介绍了如何使用别名来简化MyBatis的配置
    2026-03-03

最新评论