博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有节操的设计多参数方法
阅读量:7094 次
发布时间:2019-06-28

本文共 1878 字,大约阅读时间需要 6 分钟。

对于一个类而言,如果要想获取它的一个实例,最基本的方法是通过默认公有的构造函数去new一个,例如:

Demo demo = new Demo();

如果想在new的时候给Demo类的两个属性赋值,就需要使用额外的构造函数,例如:

public Demo(String a, String b) {

this.a = a;

this.b = b;

}

Demo demo = new Demo("a","b");

但是,如果这个Demo类有很N个属性,例如6个(也可以更多),现在也想在new的时候给Demo类的6个属性赋值,你还会使用多参数的构造函数new一个吗?

笔者认为大多数程序员都不会选择这么做!了解一下为什么不这么做的原因。对属性名称正确命名的情况还好,在使用这种多参数构造函数的时候,从参数名称上还知道给应该给哪个参数赋什么值,但是你需要记住这些参数的顺序及位置,如果参数很多,你还能准确无误的赋值吗?有些时候有的属性需要赋值,有的不需要,难道你有的不赋值,有的赋值?如果你使用别人jar里提供的Demo类,但是你看不到源代码,也没有javadoc文档,你是不是更无从下手了?还有,这样new一个对象是不是很累?

可能有的程序员会说,这很简单,先使用默认公有的构造函数new一个实例,然后使用属性的setter方法给每个属性赋值,完美解决!

相信很多人会同意这样的做法,但是,这样真的不是最优解。类的属性提供setter方法后,你可以在任何地方去set,这样会导致给属性赋值的代码分散在各个角落,进而导致连自己都不知道在什么地方“又重新”赋了值,不容易管理。

针对这种多参数的方法,无论是构造函数,还是普通的函数,有节操的做法是使用Builder模式,有兴趣的可以自行科普一下Builder模式,还是同样的代码,看一下Builder模式是如何解决这个问题的。

public class Demo {

private String firstName;

private String lastName;

private int age;

private Demo(Builder builder) {

firstName = builder.firstName;

lastName = builder.lastName;

age = builder.age;

}

public static Builder newBuilder() {

return new Builder();

}

public static final class Builder {

private String firstName;

private String lastName;

private int age;

private Builder() {

}

public Builder withFirstName(String val) {

firstName = val;

return this;

}

public Builder withLastName(String val) {

lastName = val;

return this;

}

public Builder withAge(int val) {

age = val;

return this;

}

public Demo build() {

return new Demo(this);

}

}

public static void main(String[] args) {

Demo demo = Demo.newBuilder()

.withFirstName("aaa")

.withLastName("bbb")

.withAge(8)

.build();

}

}

上面的代码为了节省空间没有写getter方法,getter方式是需要的。在main方法可以看到使用Builder模式new一个实例,代码很清晰,要给哪个属性赋值就给哪个属性赋值,属性再多也不怕,再也不用牢记哪个位置对应哪个属性了,而且这里的赋值都在一个地方,不分散、好管理。

上面说的是如何有节操的创建一个类的实例,同样,对类中的普通方法也很适用,即如果类的方法参数超过了三个,那就需要将这些参数抽象成一个类,并且类中使用Builder模式,然后使用这个类代替原来的参数,在实际方法调用的时候使用Builder模式构造这个参数类。

代码首先是写给人看的,其次才是给机器运行的,追求有节操的代码,你会收获更多!共勉!

转载地址:http://aniql.baihongyu.com/

你可能感兴趣的文章
2018年澳门赌场毛收入增14% 贵宾厅增长放缓
查看>>
杭州机场春运预计起降航班3.3万架次 国际和地区增开428架次
查看>>
菲律宾一座“慰安妇”少女像设置仅两天就被撤走
查看>>
美总统特朗普驳斥美媒涉通俄门报道:极具侮辱性
查看>>
[2]十道算法题【Java实现】
查看>>
深入React的生命周期(下):更新(Update)
查看>>
js实现栈
查看>>
前端必备,50 个 Chrome Developer Tools 必备技巧
查看>>
客户故事:4家银行如何打造新一代移动金融中心
查看>>
NDK开发中这些基本知识你都懂吗
查看>>
自动化运维工具ansible的实践
查看>>
一个22万张NSFW图片的鉴黄数据集?我有个大胆的想法……
查看>>
do 一下来了一个 redux
查看>>
Vue教程09:双向绑定对象中属性原理
查看>>
如何实现VM框架中的数据绑定
查看>>
关于this
查看>>
[译] 系列教程:选择准备安装的 TensorFlow 类型
查看>>
Webhook到底是个啥?
查看>>
Flutter学习 ---- TravisCI加持
查看>>
借用UAC完成的提权思路分享
查看>>