一尘不染

Java中的构造方法重载-最佳实践

java

有一些与此类似的话题,但是我找不到一个足够答案的话题。

我想知道Java中构造函数重载的最佳实践是什么。我已经对这个主题有自己的想法,但是我想听听更多的建议。

我既指的是简单类中的构造函数重载,也指继承已经重载的类时的构造函数重载(这意味着基类具有重载的构造函数)。

谢谢 :)


阅读 335

收藏
2020-03-14

共1个答案

一尘不染

虽然没有“官方指南”,但我遵循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使用相同方式的类,参数类和简单工厂类几乎是同一件事。

2020-03-14