解析 Java 链式编程以及 Lombok 对链式编程的支持

所谓链式编程,即:方法可链式调用,方法调用完后返回对象本身,然后又可以继续调用该对象的方法。

常用的 StringBuffer 就是链式编程的例子:

1
2
3
StringBuffer str = new StringBuffer();
str.append("a").append("b").append("c").append("d").append("e");
// 结果:abcde

假设在实际开发中有这样一个 User 类(这是一个最简单的 JavaBean):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class User {

private int userId;
private String userName;

public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}

如果要新建一个对象,给属性设值,常规的写法是:

1
2
3
4
User u = new User();
u.setUserId(123456);
u.setUserName("张三");
// ...

如果使用链式编程方式,需要先修改 Setter 方法,return this

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class User {

private int userId;
private String userName;

public int getUserId() {
return userId;
}
public User setUserId(int userId) {
this.userId = userId;
return this;
}
public String getUserName() {
return userName;
}
public User setUserName(String userName) {
this.userName = userName;
return this;
}

}

同样给属性设值,则可以这样写:

1
2
User u = new User();
u.setUserId(123456).setUserName("张三");

是不是感觉代码简洁不少?可在需要重复调用 Setter 方法的类上可以改成这种方式。

Lombok 对链式编程的支持

这种场景 Lombok 也想到了,只需要在类上加上注解 @Accessors(chain = true),这个类生成的Setter 方法就是支持链式调用的了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Accessors(chain = true) // Lombok 链式编程
public class User {

@Getter
@Setter
private int userId;

@Getter
@Setter
private String userName;
}

可以看出编译后生成的 Setter 方法是有返回 User 对象本身的: