This question already has answers here:
Why Java doesn't provide default constructor, if class has parametrized constructor? [duplicate]
(4个答案)
去年关闭。
换句话说,即使Java编译器提供了默认构造函数,即使存在带有args的构造函数,也会有什么问题呢?
在这种情况下,没有no-arg构造函数意味着很难知道如何正确反序列化它。
(4个答案)
去年关闭。
换句话说,即使Java编译器提供了默认构造函数,即使存在带有args的构造函数,也会有什么问题呢?
最佳答案
一般而言,如果不提供任何参数,Java将提供无参数的构造函数。
如果您有一个“ 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构造函数意味着很难知道如何正确反序列化它。