虽然没有“官方指南”,我遵循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
}
}
从单元测试的角度来看,测试类将变得容易,因为你可以把资源放入它。如果类有许多资源(或者一些OO-geek调用它的协作者),请考虑以下两种情况之一:
创建一个参数类
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类,他们使用相同的方式。