java Lombok 注解之-Accessors


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错误

所以在继承类中,禁止使用链式方法

Categories:

Tags:

No Responses

发表回复

您的电子邮箱地址不会被公开。