java this 代替_改善Java方法链特性:使用this代替void作为方法返回值

方法链(method chaining)是API设计提倡的fluent interface的一种实现,能够提高代码可读性。

当一个类拥有很多属性并且允许这些属性拥有缺省值时,构造对象往往会变得很麻烦。要么,会有一个很长的构造方法,你需要记住每个参数的位置,并且在构造时会显式的传入缺省值,比如:

public class Person{

String name;

int age;

char sex;

String phone;

String address;

double salary;

public Person(String name,int age,char sex,String phone,String address,double salary){

this.name=name;

this.age=age;

this.sex=sex;

this.phone=phone;

this.address=address;

this.salary=salary;

}

//其他setter/getter方法

}

Person person = new Person("刘杰", 18, 'm', null, null);

或者,我们可以使用重载定义具有缺省值的构造方法,但这会增加API的复杂性,同时降低代码可读性。另外,有时候参数顺序也难以确定(后面的参数拥有缺省值),你无法重载拥有两个完全相同参数列表的方法,甚至重载两个参数个数相同的方法也是不推荐的,比如:

public Person(String name,String phone){}

public Person(String name,String address){} // 编译错误

public Person(String name,int age){}

public Person(String name,double salary){} // 有点危险

通常,我们会使用构造器模式来实现方法链调用,比如:

Person person = new PersonBuilder()

.setName("刘杰")

.setAge(18)

.setSex('m')

.setPhone("13333333")

.build();

然而对大多数类来说,类生成的逻辑并不复杂,仅仅是将数据填充到相应的字段上。这时候,使用构造器模式反而降低了开发效率。因此,更好的实践是:将返回void的方法改为返回this,尤其是Java Bean中的set方法:

public Person setName(String name){

this.name=name;

return this;

}

Person person = new Person()

.setName("刘杰")

.setAge(18)

.setSex('m')

.setPhone("13333333");

当使用了继承,可能还会碰到一些麻烦:

public class Student extends Person{

String school;

// school的setter/getter方法

}

Student student = new Student()

.setName("郑浩")

.setSchool("浙江大学"); // 编译错误

解决上面的问题大概有两种方法,第一种是重写父类的方法:

// Java允许重写方法返回原方法返回值的子类型

@Override

public Student setName(String name){

super.setName(name);

return this;

}

第二种是使用泛型方法转型,虽然会产生编译警告,但可以少写点代码:

@SuppressWarnings("unchecked")

public T setName(String name){

this.name=name;

return (T)this;

}

Student student = new Student()

.setName("郑浩")

.setSchool("浙江大学");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值