Java强制您提供无参数构造函数的逻辑是什么? [重复]

问题描述 投票:0回答:2

换句话说,如果Java编译器提供了默认构造函数会出现什么问题,即使在存在带args的构造函数的情况下也是如此?

java constructor default-constructor
2个回答
1
投票

一般来说,如果没有提供,Java将提供无参数构造函数。

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

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

我对我的库采取的另一种方法是调用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
投票

...甚至在还有一个带args的构造函数的情况下?

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

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

相反,想要没有类的构造函数是一个不常见的用例。因此,当你没有提供任何一个明确的(一些)意义时提供一个(虽然坦率地说,如果它根本没有提供默认值,我会同样高兴)。

© www.soinside.com 2019 - 2024. All rights reserved.