当前位置: 首页 > 面试题库 >

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

单修德
2023-03-14
问题内容

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

我想知道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使用相同方式的类,参数类和简单工厂类几乎是同一件事。



 类似资料:
  • 问题内容: 有一些类似的话题,但我找不到一个有足够答案的。 我想知道Java中构造函数重载的最佳实践是什么。关于这个问题我已经有了自己的想法,但我想听听更多的建议。 我指的是简单类中的构造函数重载和继承已重载类(意味着基类具有重载构造函数)时的构造函数重载。 问题答案: 虽然没有“官方指导方针”,但我遵循亲干原则。使重载构造函数尽可能简单,最简单的方法是它们只调用this(…)。只需要检查一次参数

  • 构造函数也可以像任何其他方法一样重载,我知道这一事实。由于一项任务,我决定使用具有多个构造函数的抽象超类: 抽象超类: 为了访问这些构造函数中的每一个,我还需要子类中的多个构造函数。 泡泡ort.java: 在这种情况下,子类的每个构造函数都立即调用超类的构造函数。我突然想到,我可以再次引用自己的构造函数并传递值: 这样做将允许我省略抽象超类中的3个重载构造函数,但会强制每个子类遵循相同的模式。

  • 本文向大家介绍Java编程中的构造方法重载,包括了Java编程中的构造方法重载的使用技巧和注意事项,需要的朋友参考一下 与方法重载类似,构造函数加载是使用不同类型的参数创建和使用构造函数。我们可以使用该运算符来引用构造函数。请参见下面的示例。 示例 输出结果

  • 本文向大家介绍C ++中的构造方法重载,包括了C ++中的构造方法重载的使用技巧和注意事项,需要的朋友参考一下 众所周知,函数重载是面向对象语言的核心功能之一。我们可以使用相同的功能名称;其参数集不同。在这里,我们将看到如何重载C ++类的构造函数。构造函数重载有几个重要概念。 重载的构造函数必须具有相同的名称和不同数量的参数 根据传递的参数的数量和类型来调用构造函数。 我们在创建对象时必须传递参

  • 本文向大家介绍C#中的构造方法重载,包括了C#中的构造方法重载的使用技巧和注意事项,需要的朋友参考一下 如果在同一个类中定义了多个具有相同名称的构造函数,则如果每个构造函数的参数不同,则将它们称为重载。 让我们看一个示例,以学习如何在C#中使用构造函数重载。 在示例中,我们有两个主题和一个“学生姓名”的字符串声明。 我们正在显示三个不同学科的学生的成绩。在我们的示例中,为显示构造函数重载,仅为学生

  • 问题内容: 我正在尝试为我的NodeJS项目构建一组实用程序。这些帮助程序包括:文本实用程序(如子字符串,控制台日志记录等),以及更具体的帮助程序,如分析tweet的文本。 因此,我试图将模块划分为不同的文件,并对每件事的含义非常清楚。 例如,我想实现以下目标: 如您所见,我通过调用非常特定的方法和子方法将Utils用于不同的事情。 我试图了解继承在这里的工作原理,但我有点迷失了。 这就是我正在做