换句话说,即使Java编译器提供了默认构造函数,即使在也有带有args的构造函数的情况下,又会有什么问题呢?
答案 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 构造函数是不常见的用例。因此,在您不提供任何明确提示的情况下提供一个是有道理的(尽管坦率地说,如果根本不提供默认值,我也会很高兴)。