1

在设计一个类时,我应该努力使构造函数无参数吗?

4

6 回答 6

8

没有。您可以拥有任意数量的构造函数,并且不一定需要默认构造函数。您的构造函数应该对类的目的有意义,这是唯一的最佳实践。

于 2012-04-12T19:27:27.663 回答
3

对此有不同的想法。JavaBeans 模式需要一个默认的构造函数和getter 和setter 来完成一个对象。但是,这会导致实例处于不确定状态(有关此内容的更多信息,请参阅 Josh Bloch 的 Effective Java)。

构造函数参数可以防止任何形式的“魔法”,因为您需要提供所需的实例来创建类的实例(也称为依赖注入)。

于 2012-04-12T19:27:59.677 回答
2

答案既不是是也不是:这取决于。

通常,参数化构造函数用于初始化具有不可变 ( 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);
}

在这种情况下,除非明确打开,否则灯开关被认为是关闭的。

于 2012-04-12T19:28:21.760 回答
1

一点都不。默认或“无参数”构造函数通常是类具有的有用功能,但仅作为可用的构造函数之一,而不是唯一的构造函数。在构造过程中建立对象的重要不变量是一件好事,而带有参数的构造函数通常是实现这一点的必要部分。

于 2012-04-12T19:25:39.570 回答
1

我会说不。当使用解耦机制时,例如依赖注入,构造函数的参数是定义不可变依赖的完美位置。同样,对象的任何其他不可变参数都应该放在构造函数中。

于 2012-04-12T19:26:12.423 回答
0

当听到一些断章取义的东西、没有完全听到建议或用外语听到它时,这可能是一种误解。我怀疑你听到有经验的人说(也许过分强调)这样的话:

1)“你应该总是尝试有一个无参数的构造函数。”

然后你误解了这个意思:

2)“你应该总是尝试只有一个无参数的构造函数。”

声明 (1) 是正确的,因为如果在相关类上调用无参数构造函数 - 或由子类调用 - 如果不存在,则编译器将创建自己的,并且代码的行为将难以预测。

陈述(2)通常不正确。

于 2018-12-02T19:51:08.073 回答