基础

链式编程定义:链式编程的原理就是返回一个 this 对象,就是返回本身,达到链式效果

  1. public class User {
  2. private Integer id;
  3. private String name;
  4. private Integer age;
  5. public User setId(Integer id) {
  6. this.id = id;
  7. return this;
  8. }
  9. public User setName(String name) {
  10. this.name = name;
  11. return this;
  12. }
  13. public User setAge(Integer age) {
  14. this.age = age;
  15. return this;
  16. }
  17. }

StringBuilder 就使用了链式编程的写法:

  1. // StringBuilder的append方法的源码
  2. @Override
  3. public StringBuilder append(String str) {
  4. super.append(str);
  5. return this;
  6. }
  7. // StringBuilder的append方法使用
  8. StringBuilder builder = new StringBuilder();
  9. builder.append("Hello").append("\t").append("world!");

lombok中使用链式编程

在 pom.xml 文件中引入 lombok 依赖:

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <version>1.18.14</version>
  5. <scope>provided</scope>
  6. </dependency>

lombok 实现链式编程:在 bean 上添加 @Accessors(chain = true)

  1. @Data
  2. @Accessors(chain = true)
  3. public class User implements Serializable {
  4. private static final long serialVersionUID = -1602774207630314992L;
  5. private Integer id;
  6. private String username;
  7. private String password;
  8. }

静态链式编程

静态的链式编程比普通的链式编程的好处:

  • 创建对象更简单
  • 可以在静态方法、静态代码块等中使用
  • 对于必输字段,可以强制要求

屏蔽 class 的 new,只能通过静态方法创建新实例,如:

  1. public class User {
  2. private Integer id;
  3. private String name;
  4. private Integer age;
  5. // 静态构造方法,避免外部调用
  6. private User(){
  7. }
  8. // 对外提供的创建对象的方法
  9. public static User of(){
  10. return new User();
  11. }
  12. public User setId(Integer id) {
  13. this.id = id;
  14. return this;
  15. }
  16. public User setName(String name) {
  17. this.name = name;
  18. return this;
  19. }
  20. public User setAge(Integer age) {
  21. this.age = age;
  22. return this;
  23. }
  24. }

在创建 bean 时,存在一些必输字段,静态的链式编程可以声明这些必输字段:

  1. public class User {
  2. private Integer id;
  3. private String name;
  4. private Integer age;
  5. // 静态构造方法,避免外部调用
  6. private User(){
  7. }
  8. // 对外提供的创建对象的方法
  9. public static User of(String name){
  10. if (name == null) {
  11. throw new NullPointerException("name is marked non-null but is null");
  12. } else {
  13. this.name = name;
  14. }
  15. }
  16. public User setId(Integer id) {
  17. this.id = id;
  18. return this;
  19. }
  20. public User setName(String name) {
  21. this.name = name;
  22. return this;
  23. }
  24. public User setAge(Integer age) {
  25. this.age = age;
  26. return this;
  27. }
  28. }

lombok 使用静态链式编程

在 bean 上添加 @RequiredArgsConstructor(staticName = “of”) 注解就可以实现静态链式编程

  • 其中 staticName 用来设置静态创建方法的名称
  • 当需要设置某个参数必须在创建时提供的话,可以在相应的参数上添加 @NonNull 注解
    1. @Data
    2. @Accessors(chain = true) // 支持链式编程
    3. @RequiredArgsConstructor(staticName = "of")
    4. public class User implements Serializable {
    5. private static final long serialVersionUID = -1602774207630314992L;
    6. @NonNull
    7. private Integer id;
    8. private String username;
    9. private String password;
    10. }

builder 模式的链式 Bean

builder 模式实现原理为在 bean 里面创建一个 静态 builder 方法 和一个 静态内部Builder类,通过调用静态 builder 方法来创建 Builder 类,然后通过 builder 类中的 build 方法直接创建一个 Bean,具体实现:

  1. public class User {
  2. private Integer id;
  3. private String name;
  4. private String password;
  5. public User(Integer id ,String name ,String password) {
  6. this.id = id;
  7. this.name = name;
  8. this.password = password;
  9. }
  10. // 静态 builder 方法
  11. public static User.Builder builder() {
  12. return new User.Builder();
  13. }
  14. // 静态内部类 Builder
  15. public static class Builder {
  16. private Integer id;
  17. private String name;
  18. private String password;
  19. public User.Builder id(Integer id) {
  20. this.id = id;
  21. return this;
  22. }
  23. public User.Builder name(String name) {
  24. this.name = name;
  25. return this;
  26. }
  27. public User.Builder password(String password) {
  28. this.password = password;
  29. return this;
  30. }
  31. public User build(){
  32. return new User(id ,name ,password);
  33. }
  34. }
  35. public Integer getId() {
  36. return id;
  37. }
  38. public void setId(Integer id) {
  39. this.id = id;
  40. }
  41. public String getName() {
  42. return name;
  43. }
  44. public void setName(String name) {
  45. this.name = name;
  46. }
  47. public String getPassword() {
  48. return password;
  49. }
  50. public void setPassword(String password) {
  51. this.password = password;
  52. }
  53. }

使用:

  1. public static void main(String[] args) {
  2. User user = User.builder().id(12).name("Bob").password("123456").build();
  3. }

lombok 实现 builder 模式的链式 bean

lombok 实现 builder 模式的链式 bean,只需要在相应 bean 上添加一个注解:@Builder ,@Builder 注解中支持如下参数:

  • builderClassName = “Builder”:内部创建类的名称
  • builderMethodName = “builder”:获取静态内部类的方法
  • buildMethodName = “build”:创建方法名称
  • toBuilder = true:是否创建一个 toBuilder 方法,用于将外部类转换成一个构造器 Builder
    1. @Data
    2. @Builder
    3. public class User implements Serializable {
    4. private static final long serialVersionUID = -1602774207630314992L;
    5. private Integer id;
    6. private String username;
    7. private String password;
    8. }
    有关 Builder 的其他用法:https://www.jianshu.com/p/d08e255312f9