lombok注解:@Builder

发布时间 2023-09-27 10:23:35作者: 做个读书人

带有注释的方法@Builder(从现在起称为target)会导致生成以下 7 个内容:

  • 名为 的内部静态类FooBuilder,具有与静态方法相同的类型参数(称为builder)。
  • 构建器中:目标的每个参数都有一个私有非静态非最终字段
  • 构建器中:包私有无参数空构造函数。
  • 构建器中:目标的每个参数都有一个类似“setter”的方法:它与该参数具有相同的类型和相同的名称。它返回构建器本身,以便可以链接设置器调用,如上面的示例所示。
  • 构建器中:build()调用方法的方法,传入每个字段。它返回的类型与目标返回的类型相同
  • 构建器中:一个合理的toString()实现。
  • 在包含目标 的类中: 一个方法,用于创建构建器builder()的新实例

 以作用于方法体上,也可以作用于类上,作用于类上时生成一个私有构造函数,其中所有字段作为参数,方便我们快速构造对象

传统赋值方法:

Person person = new Person();
person.setName("Adam Savage");
person.setCity("San Francisco");
person.setJob("Mythbusters");

使用@Builder之后:

Person person =  Person.builder()
.name("Adam Savage")
.city("San Francisco")
.job("Mythbusters")
.build();

@Builder.default

在传统对象中,我们直接对参数赋值可以初始化参数,但是使用@Builder后,初始化参数是无效的,所以需要使用@Builder.Default注明这是一个默认构造参数

@Data
@Builder
public class Person{
    private String name = "aaa";
    
    @Builder.Default
    private String city = "bbb";
     
    private String job;   
}    
public static void main(String[] args){
    Person person = Person.builder().build();
    System.out.println(person.toString());
}

结果为:

Person(name=null, city="bbb", job=null)

@Singular

@Data
@Builder
public class Person{
    private String name = "aaa";
    
    @Builder.Default
    private String city = "bbb";
     
    private String job;   
    
    @Singular
    private List<String> intrests;
    
}  
public static void main(String[] args){
    Person person = Person.builder().name("aaa").intrest("1111").intrest("2222").build();
    System.out.println(person.toString());
}

结果为:

Person(name="aaa", city="bbb", job=null,intrests=["1111","2222"])

@Singular可以识别简单的复数单词,对于以以“s”结尾的单词,要删除最后一个字母;对于某些以“es”结尾的单词,要删除最后两个字母,对于不能识别的会报错

@Data
@Builder
public class Person{
    private String name = "aaa";
    
    @Builder.Default
    private String city = "bbb";
     
    private String job;   
    
    @Singular
    private List<String> intrests;

    @Singular("tag")
    private List<String> tagList;
    
} 
public static void main(String[] args){
    Person person = Person.builder().name("aaa").intrest("1111").intrest("2222").tag("tag1").tag("tag2").build();
    System.out.println(person.toString());
}

结果为:

Person(name="aaa", city="bbb", job=null,intrests=["1111","2222"],tag=["tag1","tag2"])