有一些与此类似的话题,但是我找不到一个足够答案的话题。
我想知道Java中构造函数重载的最佳实践是什么。我已经对这个主题有自己的想法,但是我想听听更多的建议。
我既指的是简单类中的构造函数重载,也指继承已经重载的类时的构造函数重载(这意味着基类具有重载的构造函数)。
谢谢 :)
虽然没有“官方指南”,但我遵循KISS和DRY的原则。使重载的构造函数尽可能简单,最简单的方法是只调用this(…)。这样,你只需要检查和处理一次参数即可。
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-极客称之为协作者),请考虑以下两件事之一:
制作参数类
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; }
Make a factory class
创建一个工厂类来为你初始化资源,如果初始化资源有点困难,这将是有利的:
public interface ResourceFactory { public Resource createR1(); public Resource createR2(); }
然后,以与参数类相同的方式完成构造函数:
public Simple(ResourceFactory factory) { this(factory.createR1(), factory.createR2()); }
两者结合
是的…你可以根据当时更容易的方式将两种方式混合搭配。考虑到Simple使用相同方式的类,参数类和简单工厂类几乎是同一件事。