摘要:方法链是设计提倡的的一种实现,能够提高代码可读性。这时候,使用构造器模式反而降低了开发效率。
方法链(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") publicT setName(String name){ this.name=name; return (T)this; } Student student = new Student() . setName("郑浩") .setSchool("浙江大学");
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64798.html
摘要:通常,这种模式是通过定义一个代表处理对象的抽象类来实现的,在抽象类中会定义一个字段来记录后续对象。工厂模式使用表达式第章中,我们已经知道可以像引用方法一样引用构造函数。 一、为改善可读性和灵活性重构代码 1.改善代码的可读性 Java 8的新特性也可以帮助提升代码的可读性: 使用Java 8,你可以减少冗长的代码,让代码更易于理解 通过方法引用和Stream API,你的代码会变得更...
摘要:表达式体现了函数式编程的思想,即一个函数亦可以作为另一个函数参数和返回值,使用了函数作参数返回值的函数被称为高阶函数。对流对象进行及早求值,返回值不在是一个对象。 Java8主要的改变是为集合框架增加了流的概念,提高了集合的抽象层次。相比于旧有框架直接操作数据的内部处理方式,流+高阶函数的外部处理方式对数据封装更好。同时流的概念使得对并发编程支持更强。 在语法上Java8提供了Lamb...
摘要:元素的位置通过以及属性进行规定。请求会向指定资源提交数据,请求服务器进行处理。无状态通信的会话状态应该全部由客户端负责维护。 HTML html5的新特性 文件类型声明()仅有一型:。 新的解析顺序:不再基于SGML。 绘画 canvas; 用于媒介回放的 video 和 audio 元素; 语意化更好的内容元素:article、footer、header、nav、section; ...
阅读 3853·2021-11-22 13:54
阅读 2638·2021-09-30 09:48
阅读 2326·2021-09-28 09:36
阅读 3076·2021-09-22 15:26
阅读 1303·2019-08-30 15:55
阅读 2459·2019-08-30 15:54
阅读 1391·2019-08-30 14:17
阅读 2313·2019-08-28 18:25