无参数构造函数被认为是OOP中的最佳实践

时间:2012-04-12 19:24:03

标签: java oop

在设计类时,我是否应该努力使构造函数无参数?

6 个答案:

答案 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)通常不正确。