在设计类时,我是否应该努力使构造函数无参数?
答案 0 :(得分:8)
否即可。您可以拥有任意数量的构造函数,并且您不一定需要默认构造函数。 你的构造函数应该对类的目的有意义,这是唯一的最佳实践。
答案 1 :(得分:3)
对此有不同的看法。 JavaBeans模式需要一个默认构造函数,getter和setter来完成一个对象。但是,这会导致实例处于不稳定状态(有关此内容的更多信息,请参阅Josh Bloch的Effective Java)。
构造函数参数可以防止任何形式的“魔法”,因为您需要提供创建类实例所需的实例(也称为依赖注入)。
答案 2 :(得分:1)
不,一点也不。默认或“无参数”构造函数通常是类的有用特性,但仅作为可用构造函数之一,而不是唯一构造函数。在构造期间建立对象的重要不变量是一个好的事物,带参数的构造函数通常是实现它的必要部分。
答案 3 :(得分:1)
我会说不。使用解耦机制(如依赖注入)时,构造函数的参数是定义不可变依赖项的理想位置。同样,对象的任何其他不可变参数都应该放在构造函数中。
答案 4 :(得分:1)
答案既不是也不是:它取决于。
通常,参数化构造函数用于初始化具有不可变(final
)值的对象。我想到的第一件事就是以下例子。
public class Car {
public Car(String chassisCode) {...}
public String getChassisCode();
public String getLicenseNumber() {...}
public void setLicenseNumber(String value) {...}
}
由于车牌注册号可以在汽车的生命周期中发生变化,因此可以将其作为获取/设置属性实施。相反,机箱注册码对于每辆车都是唯一的,并且不可变。汽车可以随时更换其牌照,但底盘号码是不可变的,并且在牌照或所有者更改时随时记录在文档中。
在其他情况下,您可能需要“默认”无参数构造函数来获取类的“默认”行为。一个例子
public class LightSwitch {
private boolean state = false; //off
public LightSwitch() {}
public boolean getState();
public void setState(boolean value);
}
在这种情况下,除非明确打开,否则灯开关被视为关闭。
答案 5 :(得分:0)
在听不见情境,听不完整的建议或以外语听取建议时,可能会产生误解。 我怀疑您听到有人经历过(也许过分强调)这样的话:
1)“您应该始终尝试使用无参数构造函数。”
然后您误解为:
2)“您应该始终尝试仅使用无参数构造函数。”
声明(1)是正确的,因为如果在有关的类(或子类)上调用了无参数的构造函数,并且如果不存在任何构造函数,则编译器将创建自己的构造函数,并且代码的行为将难以预测。
声明(2)通常不正确。