有节操的设计多参数方法

对于一个类而言,如果要想获取它的一个实例,最基本的方法是通过默认公有的构造函数去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模式构造这个参数类。

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值