Why the default constructor is not provided when typing an argument-ed constructor in java?
在java中,如果我们为一个类键入一个带参数的构造函数,我们不能调用它的默认无参数构造函数。我知道这是因为如果我们键入任何带参数的构造函数,编译器不会提供默认的无参数构造函数。但我的问题是这样设计的原因是什么?
如果你提供一个带有参数的构造函数,它假定对象将被创建为有效状态。
如果默认情况下暴露了无参数构造函数(并且类的创建者没有采取防御措施),那么有人可能会无意中创建一个无效的对象——一个没有足够信息来正确的对象。
通过强制我们提供一个无参数的构造函数,Java 强制我们明确地表明创建一个没有这些初始值/状态的对象是可以的。
简而言之:Java 试图将我们从自己手中拯救出来,因为我们草率且健忘。
当您不提供构造函数时,它会假定您需要一个并为您创建一个。
当您提供构造函数时,它假定您知道自己在做什么,并且您将提供您真正想要的每个构造函数。这是为了防止创建无效的默认构造函数。
是为了让类设计者禁止使用无参构造函数。
这可能有多种原因,例如该类有一些通过构造函数参数初始化的成员,因此在函数中,该类可以安全地假设这些成员不为空。
如果默认构造函数仍然可用,每个函数都应该检查这个成员是否为空。
可以这样做:编译器可以看到没有默认构造函数但有一个 (T...) 构造函数,并创建一个:
1 | ...() { this(new T[0]); } |
要么被遗忘,要么被认为丑陋。当有 (U...) 时怎么办?