经常会看到一些代码使用连续的.set()方法来进行初始化,这种实现方式是链式方法调用。
传统方式
通常,我们在进行对象初始化的时候,可以调用.set()方法对某个属性进行赋值,例如:
public class FixedDepositDetails {
private long id;
private float depositAmount;
private int tenure;
private String email;
public FixedDepositDetails() {
}
public FixedDepositDetails(long id, float depositAmount, int tenure, String email) {
this.id = id;
this.depositAmount = depositAmount;
this.tenure = tenure;
this.email = email;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public float getDepositAmount() {
return depositAmount;
}
public void setDepositAmount(float depositAmount) {
this.depositAmount = depositAmount;
}
public int getTenure() {
return tenure;
}
public void setTenure(int tenure) {
this.tenure = tenure;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "FixedDepositDetails{" +
"id=" + id +
", depositAmount=" + depositAmount +
", tenure=" + tenure +
", email='" + email + '\'' +
'}';
}
}
使用方式也是传统的方法,例如:
import org.junit.Test;
public class FixedDepositDetailsTest {
@Test
public void testObjectCreate() {
FixedDepositDetails fixedDepositDetails = new FixedDepositDetails();
fixedDepositDetails.setId(1L);
fixedDepositDetails.setDepositAmount(1000);
fixedDepositDetails.setEmail("[email protected]");
fixedDepositDetails.setTenure(100);
System.out.println(fixedDepositDetails);
}
}
没有什么特别的,这是大家都熟悉的模式。
链式方法
现在,来看一下,链式调用,其代码如下:
import org.junit.Test;
public class FixedDepositDetailsTest {
@Test
public void testObjectCreate() {
FixedDepositDetails fixedDepositDetails = new FixedDepositDetails();
fixedDepositDetails.setId(1L)
.setDepositAmount(1000)
.setEmail("[email protected]")
.setTenure(100);
System.out.println(fixedDepositDetails);
}
}
是不是和前面创建对象的方式有很大不同。
要实现链式方法调用,其实很简单,就是让每个set方法,返回自己即可,也很容易实现,例如:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FixedDepositDetails {
private static Logger logger = LoggerFactory.getLogger(FixedDepositDetails.class);
private long id;
private float depositAmount;
private int tenure;
private String email;
public FixedDepositDetails() {
logger.info("Created instance");
}
public long getId() {
return id;
}
public FixedDepositDetails setId(long id) {
this.id = id;
return this;
}
public float getDepositAmount() {
return depositAmount;
}
public FixedDepositDetails setDepositAmount(float depositAmount) {
this.depositAmount = depositAmount;
return this;
}
public int getTenure() {
return tenure;
}
public FixedDepositDetails setTenure(int tenure) {
this.tenure = tenure;
return this;
}
public String getEmail() {
return email;
}
public FixedDepositDetails setEmail(String email) {
this.email = email;
return this;
}
public String toString() {
return "id :" + id + ", deposit amount : " + depositAmount
+ ", tenure : " + tenure + ", email : " + email;
}
}
idea自动生成
可以使用idea环境,自动生成返回this的set方法,选择Setter template:
为Builder
即可生成想要的set方法,如下图所示:
当然,不管哪种方式,都是可以的。