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

新手上路,请多包涵

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

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

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

谢谢 :)

原文由 Eyal Roth 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 505
1 个回答

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

原文由 Spoike 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题