在设计一个类时,我应该努力使构造函数无参数吗?
6 回答
没有。您可以拥有任意数量的构造函数,并且不一定需要默认构造函数。您的构造函数应该对类的目的有意义,这是唯一的最佳实践。
对此有不同的想法。JavaBeans 模式需要一个默认的构造函数和getter 和setter 来完成一个对象。但是,这会导致实例处于不确定状态(有关此内容的更多信息,请参阅 Josh Bloch 的 Effective Java)。
构造函数参数可以防止任何形式的“魔法”,因为您需要提供所需的实例来创建类的实例(也称为依赖注入)。
答案既不是是也不是:这取决于。
通常,参数化构造函数用于初始化具有不可变 ( 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);
}
在这种情况下,除非明确打开,否则灯开关被认为是关闭的。
一点都不。默认或“无参数”构造函数通常是类具有的有用功能,但仅作为可用的构造函数之一,而不是唯一的构造函数。在构造过程中建立对象的重要不变量是一件好事,而带有参数的构造函数通常是实现这一点的必要部分。
我会说不。当使用解耦机制时,例如依赖注入,构造函数的参数是定义不可变依赖的完美位置。同样,对象的任何其他不可变参数都应该放在构造函数中。
当听到一些断章取义的东西、没有完全听到建议或用外语听到它时,这可能是一种误解。我怀疑你听到有经验的人说(也许过分强调)这样的话:
1)“你应该总是尝试有一个无参数的构造函数。”
然后你误解了这个意思:
2)“你应该总是尝试只有一个无参数的构造函数。”
声明 (1) 是正确的,因为如果在相关类上调用无参数构造函数 - 或由子类调用 - 如果不存在,则编译器将创建自己的,并且代码的行为将难以预测。
陈述(2)通常不正确。