java - Java中的构造函数重载 - 最佳实践

标签 java constructor overloading constructor-overloading

有几个类似的主题,但我找不到一个足够的答案。

我想知道 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;
}

制作工厂类

为你创建一个初始化资源的工厂类,如果初始化资源有点困难,这是有利的:

public interface ResourceFactory {
    public Resource createR1();
    public Resource createR2();
}

然后以与参数类相同的方式完成构造函数:

public Simple(ResourceFactory factory) {
    this(factory.createR1(), factory.createR2());
} 

将两者结合起来

是的...您可以根据当时对您来说更容易的方式混合和匹配两种方式。考虑到 Simple 类的使用方式相同,参数类和简单工厂类几乎是一回事。

关于java - Java中的构造函数重载 - 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1182153/

相关文章:

java - Clojure Java 互操作错误 : Illegal Argument Exception: NO MATCHING CONSTRUCTOR FOUND

java: NullPointerException,需要帮助

c++ - 如何在 C++ 中创建一个 "default"流插入运算符?

java - Install4j 使用正则表达式和 xpath 表达式更新 XML 文件

java - 编译 Tesseract Debugger 以可视化区域分类

java - 使用 Maven 构建项目

c++ - 在构造函数 C++ 标准中修改 const 吗?

c++ - 为命名空间中的类重载运算符 << 时发出警告

c++ - VS2010 : templates and overloaded functions 的解决方法

java - OSGIfied jar 可以像普通 jar 一样工作吗?