深入理解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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • maven配置阿里仓库的方法步骤

    maven配置阿里仓库的方法步骤

    这篇文章主要介绍了maven配置阿里仓库的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Mybatis流式查询之ResultHanlde问题

    Mybatis流式查询之ResultHanlde问题

    这篇文章主要介绍了Mybatis流式查询之ResultHanlde问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 细数Java接口的概念、分类及与抽象类的区别

    细数Java接口的概念、分类及与抽象类的区别

    下面小编就为大家带来一篇细数Java接口的概念、分类及与抽象类的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • 利用feign调用返回object类型转换成实体

    利用feign调用返回object类型转换成实体

    这篇文章主要介绍了利用feign调用返回object类型转换成实体,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java单例模式的几种常见写法

    Java单例模式的几种常见写法

    这篇文章主要介绍了Java单例模式的几种写法,单例模式是面试中的常客了,常见写法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举,接下来我们一起进入文章看看吧
    2022-05-05
  • java 使用JDBC构建简单的数据访问层实例详解

    java 使用JDBC构建简单的数据访问层实例详解

    以下是如何使用JDBC构建一个数据访问层,包括数据转换(将从数据库中查询的数据封装到对应的对象中……),数据库的建立,以及如何连接到数据库,需要的朋友可以参考下
    2016-11-11
  • Java正则表达式如何匹配特定html标签内的内容

    Java正则表达式如何匹配特定html标签内的内容

    这篇文章主要给大家介绍了关于Java正则表达式如何匹配特定html标签内的内容的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java实现简单的抽牌游戏

    Java实现简单的抽牌游戏

    这篇文章主要为大家详细介绍了Java实现简单的抽牌游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • SpringBoot集成drools的实现示例

    SpringBoot集成drools的实现示例

    本文主要介绍了SpringBoot集成drools的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 详解Java的JDBC API的存储过程与SQL转义语法的使用

    详解Java的JDBC API的存储过程与SQL转义语法的使用

    这篇文章主要介绍了详解Java的JDBC API的存储过程与SQL转义语法的使用,JDBC是Java用于连接使用各种数据库的API,需要的朋友可以参考下
    2015-12-12

最新评论