Lombok 下有一个注解为:@Accessors
@Accessors(chain = true): 使用chain属性,setter方法返回当前对象
链式调用会产生的问题,不仅仅是Accessors注解
因为此特性,所以当我们 子类和父类中同时声明了chain 编译后的代码,和下列代码相同
//父类
public class ParentBean {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public ParentBean setId(Integer id) {
this.id = id;
return this;
}
public String getName() {
return name;
}
public ParentBean setName(String name) {
this.name = name;
return this;
}
}
//子类
public class ChildBean extends ParentBean{
private Integer age;
private Integer number;
public Integer getAge() {
return age;
}
public ChildBean setAge(Integer age) {
this.age = age;
return this;
}
public Integer getNumber() {
return number;
}
public ChildBean setNumber(Integer number) {
this.number = number;
return this;
}
}
set失败:
public class BeanTest {
@Test
public void test1(){
ChildBean childBean = new ChildBean();
childBean
.setId(1) //id 是父类的属性 首次set 返回 ParentBean 对象
.setAge(1) //age 是子类的属性 因为上面返回的是 ParentBean 对象,导致无法赋值给子类,报错
.setNumber(2) //返回 ChildBean 对象
.setName("a"); //返回 ParentBean 对象
}
}
结论:链式调用-遇到继承时,因为返回的对象是 this 当前类。 所以赋值时可能产生 返回对象不一致导致的 set错误
所以在继承类中,禁止使用链式方法