有些主题与此类似,但我找不到一个有足够答案的。
我想知道Java中构造函数重载的最佳实践是什么。我已经对此有自己的想法,但我想听听更多的建议。
我所指的是简单类中的构造函数重载以及在继承已经重载了的类时的构造函数重载(也就是基类具有重载的构造函数)。
谢谢:)
有些主题与此类似,但我找不到一个有足够答案的。
我想知道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
}
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
类。
我认为最好的做法是有一个单一主构造函数,重载的构造函数通过调用this()
并使用相关参数默认值来引用它。原因在于这使得对象的构造状态更加清晰-实际上,你可以将主构造函数视为唯一真正的构造函数,其他构造函数只是委托给它。
其中一个例子可能是JTable
——主构造函数接受一个TableModel
(加上列和选择模型),其他构造函数调用这个主构造函数。
对于子类其中父类已经有了重载构造函数,我倾向于假设任何父类的构造函数都可以被视为主要,并且认为没有一个单一的主构造函数是完全合理的。例如,在扩展Exception
时,我经常提供3个构造函数:一个仅接受String
消息,一个接受Throwable
cause,以及另一个同时接受两者。每个构造函数直接调用super
。
这取决于类的种类,因为并非所有的类都是相同的。
作为一般指导原则,我建议有两个选择:
构造函数重载类似于方法重载。可以通过构造函数的不同重载方式来创建对象。
编译器根据构造函数中存在多少个参数以及参数传递的顺序等其他参数来区分构造函数。
有关Java构造函数的更多详细信息,请访问https://tecloger.com/constructor-in-java/