@Builderlombok 中的注解。可以使用builder()构造的Person.PersonBuilder对象进行链式调用,给所有属性依次赋值。

    Person person1 = Person.builder()
.name("张三")
.age(20)
.build();
System.out.println(person1); // Person(name=张三, age=20)
System.out.println(Person.builder()); // Person.PersonBuilder(name=null, age=null)

文档中给了案例,在实体类上添加 @Builder 后,实体类会被改造成如下的结构:

Before:
@Builder
class Example<T> {
private T foo;
private final String bar;
} After:
class Example<T> {
private T foo;
private final String bar; // 私有的全参数构造函数
private Example(T foo, String bar) {
this.foo = foo;
this.bar = bar;
} public static <T> ExampleBuilder<T> builder() {
return new ExampleBuilder<T>();
} public static class ExampleBuilder<T> {
private T foo;
private String bar; private ExampleBuilder() {} public ExampleBuilder foo(T foo) {
this.foo = foo;
return this;
} public ExampleBuilder bar(String bar) {
this.bar = bar;
return this;
} @java.lang.Override public String toString() {
return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
} public Example build() {
return new Example(foo, bar);
}
}
}

源码如下:

@Target({TYPE, METHOD, CONSTRUCTOR})
@Retention(SOURCE)
public @interface Builder { @Target(FIELD)
@Retention(SOURCE)
public @interface Default {} String builderMethodName() default "builder"; String buildMethodName() default "build"; String builderClassName() default ""; boolean toBuilder() default false; AccessLevel access() default lombok.AccessLevel.PUBLIC; String setterPrefix() default ""; @Target({FIELD, PARAMETER})
@Retention(SOURCE)
public @interface ObtainVia { String field() default ""; String method() default ""; boolean isStatic() default false;
}
}

@Singular 注解修饰集合

该注解默认变量的名称是一个复数,并且尝试生成该变量的奇数形式。例如 List<String> skills,会添加3个方法:

  • skill(String skill) 添加单个元素
  • skills(List<String> skillList) 添加一个集合
  • clearSkills() 清空集合,并且将未初始化的集合初始化未空集合。

如果无法计算得到变量名称的奇数形式,则会提示报错信息。用户可以手动指定单数形式的方法名:

    @Singular("skill")
private List<String> skillList;

这时会生成skill(String skill)skillList(List<String> skillList)clearSkillList()三个方法。

@Builder.Default

使用 @Builder.Default 设置默认值,构建对象时可以不用调用`name()方法。(调用后会覆盖默认值)

    @Builder.Default
private String name = "zhangsan";

@SuperBuilder

@Builder 注解无法解析父类的属性,而@SuperBuilder可以读取父类的属性。使用时需要在子类和父类上都加上这个注解

@SuperBuilder
public class Male extends Person{
} @SuperBuilder
public class Person {
@Builder.Default
private String name = "zhangsan"; private Integer age; @Singular("skillList")
private List<String> skillList;
}

@SuperBuilder(toBuilder=true)

使用 @SuperBuilder(toBuilder=true) 可以使用已有的对象构建新的对象,旧对象的属性值会被保留和覆盖。注意: 子类和父类都需要加上toBuilder=true

        Male man = Male.builder()
.name("张三")
.age(20)
.build(); Male man2 = man.toBuilder()
.age(30)
.build();

最新文章

  1. Leetcode Insert Interval
  2. fastdfs-nginx扩展模块源码分析
  3. [Android] 如何查看apk需要支持的Android版本
  4. POI中getLastRowNum() 和getLastCellNum()的区别 hssfSheet.getLastRowNum();//最后一行行标,比行数小1 hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1
  5. 把数组转换成sql中能使用的字符串
  6. 【转载】C++ inline 函数
  7. Swift与Objective-C的对比
  8. Android studio 下的 NDK 配置方法和注意事项
  9. 测测你适合从事Web前端开发吗
  10. AutoLayout适配
  11. memwatch的使用
  12. 二十7天 春雨滋润着无形 —Spring依赖注入
  13. 腾讯云无法绑定公网IP问题解释与解决方案。
  14. git bash上传代码到github
  15. tomcat原理(三)结合公司tomcat的用法的在理解
  16. unity xml序列化与反序列化 多平台
  17. 腾讯云服务器部署FTP
  18. HDU 2511 汉诺塔X
  19. sql server auto increment - trace flag 272
  20. [z]oracle优化http://jadethao.iteye.com/blog/1613943

热门文章

  1. 17.MongoDB系列之了解应用程序动态
  2. 2.Python封装练习及私有属性
  3. 题解 UVA10285 最长的滑雪路径 Longest Run on a Snowboard
  4. 支持向量机(SVM)公式整理
  5. PyCharm配置远程Docker环境
  6. 图数据 3D 可视化在 Explorer 中的应用
  7. November 练习(Tou Xue)打卡
  8. 嵌入式-Linux基础操作
  9. zephyr的GPIOTE驱动开发记录——基于nordic的NCS
  10. 面向对象进阶(static&amp;继承)