虽然没有“官方指导方针”,但我遵循KISS和DRY的原则。 使重载的构造函数尽可能简单,最简单的方法是只调用这个(…)。 这样你只需要检查和处理一次参数。
public class Simple { public Simple() { this(null); } public Simple(Resource r) { this(r, null); } public Simple(Resource r1, Resource r2) { // Guard statements, initialize resources or throw exceptions if // the resources are wrong if (r1 == null) { r1 = new Resource(); } if (r2 == null) { r2 = new Resource(); } // do whatever with resources } }
从unit testing的angular度来看,可以很容易地testing这个类,因为你可以把资源放入其中。 如果这个class有很多资源(或者一些OO-geeks称之为合作者),请考虑以下两点之一:
做一个参数类
public class SimpleParams { Resource r1; Resource r2; // Imagine there are setters and getters here but I'm too lazy // to write it out. you can make it the parameter class // "immutable" if you don't have setters and only set the // resources through the SimpleParams constructor }
Simple中的构造函数只需要拆分SimpleParams参数:
public Simple(SimpleParams params) { this(params.getR1(), params.getR2()); }
…或者使SimpleParams成为一个属性:
public Simple(Resource r1, Resource r2) { this(new SimpleParams(r1, r2)); } public Simple(SimpleParams params) { this.params = params; }
做一个工厂类
做一个工厂类为你初始化资源,如果初始化资源有点困难,
public interface ResourceFactory { public Resource createR1(); public Resource createR2(); }
然后以与参数类相同的方式完成构造函数:
public Simple(ResourceFactory factory) { this(factory.createR1(), factory.createR2()); }
把两者结合起来
是的,你可以根据当时对你来说比较容易的方式来混搭两种方式。 参数类和简单的工厂类几乎是相同的事情考虑Simple类,他们使用相同的方式。