@Builder注解使用

这篇具有很好参考价值的文章主要介绍了@Builder注解使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、@Builder注解

资料来源: http://fendou.net.cn/index.php/a/369
https://blog.csdn.net/qq_39249094/article/details/120881578
  • 作用于类,将其变成建造者模式

  • 可以以链的形式调用

  • 初始化实例对象生成的对象是不可以变的,可以在创建对象的时候进行赋值(如果想改变的话需要在@Builder后面添加参数toBuilder=true)

  • 需要在原来的基础上修改可以加 set 方法,final 字段可以不需要初始化

  • 生成一个全参的构造函数

1.0 Lombok坐标


<dependency>
   <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>         
    <version>0.10.2</version>
</dependency>

提供在设计数据实体时,对外保持private setter,而对属性的赋值采用Builder的方式,这种方式最优雅,也更符合封装的原则,不对外公开属性的写操作

@Builder声明实体,表示可以进行Builder方式初始化

@Value注解,表示只公开getter,对所有属性的setter都封闭,即private修饰,所以它不能和@Builder一起用

1.1 注解使用


@Builder
@Getter
@Data
publicclassUserInfo {
    private  String  name;
    privateStringemail;
​
    @Override
    public String toString() {
        return"UserInfo{"+
                "name='"+name+'\''+
                ", email='"+email+'\''+
                '}';
    }
​
    public static void main(String[] args) {
        UserInfo userInfo = UserInfo.builder().build();
        System.out.println("userInfo---->"+userInfo);
​
        UserInfo userInfo1 = UserInfo.builder()
                .name("zzl")
                .email("bgood@sina.com")
                .build();
        System.out.println("userInfo1---->"+userInfo1);
    }
}
@builder,springboot,java,开发语言,spring boot,Powered by 金山文档

1.2 注解的属性介绍


1.2.1 toBuilder

  • 设置为 true 可以对这个对象进行拷贝生成新的对象,可以再修改,默认为 false

怎么设置为true?

  @Builder(toBuilder = true)

我们使用UserInfo.builder().build()创建出来之后,还可以修改对象的内容么(不使用set方法)?

@builder,springboot,java,开发语言,spring boot,Powered by 金山文档

我们此时发现如果想对已经构建了的对象在修改的话,会出错,并找不到这个方法,我们只需要在类注解上添加@Builder(toBuilder = true)即可

  
@Builder(toBuilder=true)
@Getter
public class UserInfo {}
userInfo = userInfo.toBuilder()
        .name("OK")
        .email("zgood@sina.com")
        .build();

1.2.2 @Builder.Default 注解

非 final 的字段可以有默认值

@Builder.Default
private String name ="刘亦菲";

我们下面虽然没有对name赋值,但是输出时”name“依然会时"刘亦菲"

UserInfo userInfo = UserInfo.builder().build();
System.out.println("userInfo---->"+userInfo);

final字段加不加Default都可以初始化成功,因为final字段如果第一次不是null的话,就不可修改(简单的来说,final字段有了初始值之后就不可更改)

private final Integerage=18; 

这两种写法都可以

@Builder.Default
private final Integer age;  

1.2.3 buildMethodName

指定创建实体类的方法名,默认值为 build

当我们指定内部静态类的方法名为“test”的时候,发现下面已经开始报错了

@builder,springboot,java,开发语言,spring boot,Powered by 金山文档

当我们把这里改成test之后便不会报错了

@builder,springboot,java,开发语言,spring boot,Powered by 金山文档

1.2.4 builderMethodName

指定创建内部静态类的方法名,默认值为 builder

@builder,springboot,java,开发语言,spring boot,Powered by 金山文档

1.2.5 builderClassName

指定内部静态的类名,默认值为 “”,默认创建的类名为 thisclassBuilder

这个我不太懂,不知道怎么演示

1.2.6 access

设置 builderMethodName 的访问权限修饰符,默认为 public

共有 PUBLIC、MODULE、PROTECTED、PACKAGE、PRIVATE,其中 MODULE 是 Java 9 的新特性

access = AccessLevel.PUBLIC

1.2.7 setterPrefix

设置 setter 方法的前缀,默认为 “”

1.3 处理添加无参构造函数报错时报错


@Builder 会生成一个全参构造方法,因此就没有了无参构造方法,但当我们遇到需要无参构造方法时就会发生问题,这个时候手写或者加上 @NoArgsConstructor 都会报错

@builder,springboot,java,开发语言,spring boot,Powered by 金山文档

1.3.1 处理方案1

加上 @AllArgsConstructor

@builder,springboot,java,开发语言,spring boot,Powered by 金山文档

1.3.2 处理方案2

使用 @Builder 对一个 DTO 实现一个构造器,但是在做 Json 反序列化的时候发生错误,原因就是缺少无参公共的构造函数,而手动写一个无参构造函数的时候编译错误,就是和 @Builder 冲突

虽然标准的 @Builder 没法是需要私有化构造函数的,但是在某些场景下我们需要对这种标准变形,这个时候 lombok 提供了 @Tolerate 实现对冲突的兼容

使用@Tolerate注解

我们手动添加一个无参构造函数,但是当运行之后就会出现错误

@builder,springboot,java,开发语言,spring boot,Powered by 金山文档

但是当我们在无参构造函数上添加@Tolerate注解之后就可以正常运行

@builder,springboot,java,开发语言,spring boot,Powered by 金山文档

1.4 @Builder内部


  • 创建一个名为 ThisClassBuilder 的内部静态类,并具有和实体类相同的属性(称为构建器)

  • 在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性

  • 在构建器中:创建一个无参的 default 构造函数

  • 在构建器中:实体类中的每个参数,都会对应创建类似于 setter 的方法,方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用)

  • 在构建器中:会创建一个 build 方法,调用 build 方法,就会根据设置的值进行创建实体对象

  • 在构建器中:会生成一个 toString 方法

  • 在实体类中:会创建一个 builder 方法,它的目的是用来创建构建器文章来源地址https://www.toymoban.com/news/detail-769941.html

@Builder
public class User {
    private String username;
    private String password;
}
public class User {
    private String username;
    private String password;
​
​
    User(Stringusername, Stringpassword) {
        this.username=username;
        this.password=password;
    }
    
//  在实体类中会创建一个 builder 方法,它的目的是用来创建构建器
    public static User.UserBuilder builder() {
        returnnewUser.UserBuilder();
    }
//  构建器
    public static class UserBuilder {
        //在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性
        private String username;
        private String password;
        
        //在构建器中:创建一个无参的 default 构造函数
        UserBuilder() {
        }
​
        //在构建器中:实体类中的每个参数,都会对应创建类似于 setter 的方法,方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用)        
        public User.UserBuilde rusername(Stringusername) {
            this.username=username;
            returnthis;
        }
​
        public User.UserBuilderpassword(Stringpassword) {
            this.password=password;
            returnthis;
        }
        
        //在构建器中:会创建一个 build 方法,调用 build 方法,就会根据设置的值进行创建实体对象
        publicUserbuild() {
            return newUser(this.username, this.password);
        }
        
        //在构建器中:会生成一个 toString 方法 
        public String toString() {
            return"User.UserBuilder(username="+this.username+", password="+this.password+")";
        }
    }
}   

到了这里,关于@Builder注解使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是Java中的Builder模式?

    Java中的Builder模式是一种结构型设计模式,它允许你将一个复杂对象的构建过程分解为多个步骤,使得客户端可以按照一定的顺序构建对象,而无需在每个步骤中都进行实例化。这种模式有助于隐藏对象的构造过程,使得代码更加清晰、易于理解和维护。 下面是一个简单的示

    2024年02月13日
    浏览(35)
  • HarmonyOS 应用开发之wrapBuilder:封装全局@Builder

    全局@Builder作为wrapBuilder的参数返回WrappedBuilder对象,实现 全局@Builder 可以进行赋值和传递。 说明: 从API version 11开始使用。 wrapBuilder是一个模板函数,返回一个 WrappedBuilder 对象。 同时 WrappedBuilder 对象也是一个模板类。 说明:模板参数 Args extends Object[] 是需要包装的builder函

    2024年04月10日
    浏览(38)
  • GUIslice Builder 安装及使用

    GUIslice Builder是一个可视化UI设计工具,可以简化GUIslice的UI设计流程。下面是GUIslice Builder的安装和使用步骤: 首先,下载GUIslice Builder并解压缩文件。 然后,进入解压后的文件夹,并运行GUIsliceBuilder.exe。 接下来,创建一个新项目。在主界面上,选择“New Project”,并输入项目

    2024年02月09日
    浏览(35)
  • Java设计模式之建造者模式详解(Builder Pattern)

    在日常的开发工作中,我们常常需要创建一些复杂的对象。这些对象可能包含许多不同的属性,并且这些属性的初始化过程可能相当复杂。在这种情况下,建造者模式是一种非常有用的设计模式,因为它允许我们分步骤地创建复杂的对象。 概念和原理: 建造者模式(Builder

    2024年02月09日
    浏览(44)
  • java与es8实战之一:以builder pattern开篇

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 《java与es8实战》系列是欣宸与2022年夏季推出的原创系列,如标题所述,该系列从一个java程序员视角去学习和实践elasticsearch的8.2版本,目标是与大家一起掌握与elasticsearch开发相关的技能,以应对实

    2024年02月11日
    浏览(36)
  • 使用Builder AST 转换为流式API

    从Groovy 2.3开始,我们可以使用 @Builder AST转换轻松地为我们的类创建一个流畅的API。 我们可以将注释应用于我们的类,结果类文件将具有支持流畅API的所有必要方法。 我们可以自定义如何使用不同的注释参数生成流畅的API。 在Groovy代码中,我们已经可以使用 with 方法 有一个

    2024年02月07日
    浏览(35)
  • 【Java扫盲篇】String、String Buffer和String Builder的区别

    你在面试时,面试官让你讲讲 String String Buffer String Builde r的区别,你是否能流畅的、完整的叙述出他们三者的区别? 相同点: 他们的底层都是由char数组实现的。 不同点: String对象一旦创建,是不能修改的,如果要修改,会重新开辟空间来存储修改后的对象;而String Buffer和

    2024年04月22日
    浏览(36)
  • HarmonyOS 应用开发之@Builder装饰器:自定义构建函数_harmony 构件函数

    @Builder function overBuilder( KaTeX parse error: Can\\\'t use function \\\'$\\\' in math mode at position 49: …`overBuilder===$̲{ .paramA1}`) HelloComponent({message: $$.paramA1}) } } } @Component struct HelloComponent { @Link message: string; build() { Row() { Text( HelloComponent===${this.message} ) } } } @Entry @Component struct Parent { @State label: string =

    2024年04月25日
    浏览(38)
  • 解决java.lang.NoSuchMethodError org.springframework.boot.builder.SpringApplicationBuilder 问题

    问题: java.lang.NoSuchMethodError:org.springframework.boot.builder.SpringApplicationBuilder 产生原因: 由于Spring Cloud和Spring Boot 版本不兼容造成的 解决方案: 可以访问Spring的官方网站查看对应的Spring Cloud和Spring Boot版本的对应关系,如下表 SpringCloud SpringBoot 2021.0.x (又名:Jubilee) 2.6.x, 2.7.x (从 2

    2023年04月08日
    浏览(52)
  • ‘org.elasticsearch.client.RequestOptions$Builder.removeHeader(java.lang.String)‘

    学习官方文档的Java-api,习惯用Spring-boot开发,结果使用的时候遇到java.lang.NoSuchMethodError: \\\'org.elasticsearch.client.RequestOptions$Builder org.elasticsearch.client.RequestOptions$Builder.removeHeader(java.lang.String)\\\'这个问题。 各种搜索发现可能是依赖版本问题,编译时的依赖版本和运行时的不一样,找

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包