Java强迫您提供无参数构造函数的逻辑是什么?

时间:2019-03-20 18:39:37

标签: java constructor default-constructor

换句话说,即使Java编译器提供了默认构造函数,即使在也有带有args的构造函数的情况下,又会有什么问题呢?

2 个答案:

答案 0 :(得分:1)

通常来说,如果没有提供,则Java将提供no-arg构造函数。

如果您有一个“ arg”构造函数,并且不尝试使用no-arg构造函数(或定义一个),那么就没问题。

但是, Java序列化库要求您具有无参数构造函数,因此它知道在反序列化对象时如何创建对象。

我在我的库中采取的另一种方法是调用no-arg构造函数(如果存在),或者仅创建对象而不调用构造函数(如果不存在)。如果不调用构造函数,则可能会产生字段未初始化的副作用。例如

class MyClass {
    // only set if you call a constructor!
    transient final List<String> list = new ArrayList<>();
    int a;

    MyClass(int a) { this.a = a; }
}

在这种情况下,没有no-arg构造函数意味着很难知道如何正确地反序列化它。

答案 1 :(得分:1)

  

...即使在也有带有args的构造函数的情况下?

那么,除了声明一个私有的构造函数(与没有私有构造函数完全不同)之外,您无法阻止您的类具有无参数的构造函数。

只有一个接受参数的构造函数是常见的用例。在这种常见情况下,让您声明一个私有的无参数构造函数没有太大意义。

相比之下,想要一个类的 no 构造函数是不常见的用例。因此,在您不提供任何明确提示的情况下提供一个是有道理的(尽管坦率地说,如果根本不提供默认值,我也会很高兴)。