文艺是一种感受,它来自路过看的人。
代码也如此,代码文艺不文艺,首先要从client code看。
假设我们想要实现一个长方形的构造函数,怎么能写的文艺点儿呢?
1.普通青年直接用构造函数
当你看到 new Rectangular(2.0, 4.0)的时候,你知道2.0和4.0是什么意思吗?
幸运的是这个类只有两个构造参数,还不算太猛。
如果类的field太多,只有进入Rectangular的类实现去看了。像我这种记性不好的,说不定一会儿就要看下,隔一会儿又要看下。
public class Rectangular {
private final double length;private final double width;
public Rectangular(double length, double width) {
this.length = length;
this.width = width;
}
}
2.文艺青年用builder
rectangular()
.length(2.0)
.width(4.0);
这样的调用,不用再怀疑,我传入的是length还是width了。这里使用的是builder模式。
builder是一种常用的建造对象的设计模式,GoF,Effective Java中都有讲。对于多个field的类,builder是一种不错的选择。
public class Rectangular {
private double length;
private double width;
public static Rectangular rectangular() {
return new Rectangular();
}
public Rectangular length(double length) {
this.length = length;
return this;
}
public Rectangular width(double width) {
this.width = width;
return this;
}
}
3.文艺青年用嵌套方法
rectangular(length(2.0), width(4.0));
比起Method Chaining的方式,嵌套的方法不再使用Fluent Interface。
private final double length;
private final double width;
private Rectangular(double length, double width) {
this.length = length;
this.width = width;
}
public static double length(double length) {
return length;
}
public static double width(double width) {
return width;
}
public static Rectangular rectangular(double length, double width) {
return new Rectangular(length, width);
}
}
虽然length和width不能限制他传入的一定是相应的类型。但是也提供了一种可选的方法。
同时,当对象出现层次时,这种组织方式将变得更清晰。这是因为括号自己就可以显示出这样的层次。
比如:
container(
rectangular(length(2.0), length(4.0)),
rectangular(length(1.0), length(3.0))
)
这一点儿,是单纯使用第二种方法做不到或者不容易做到的。
也许你会说,你妹哦,我还不如写个json或者其他什么plain text来构造container。
恩,你这样想的话,就有点儿到点子上了。
多的不说了,上面的三种方式仅供参考,文艺和2B也只是一线之间。