为记录定义默认构造函数

56

我有一个记录并且想要给它添加默认构造函数。

public record Record(int recordId) {
   public Record {

   }
}

但它创建了一个带有int参数的构造函数。


public final class Record extends java.lang.Record {
    private final int recordId;
    public Record(int);
    //other method
}

如何为记录类型添加默认构造函数?


3
你所定义的是一个紧凑构造函数,其声明源自记录头。记录组件和紧凑构造函数中相应的形式参数之间在名称、类型和变量数量方面存在一对一的匹配关系,这同样适用于规范构造函数。记录只能有一个规范构造函数。如果声明了紧凑构造函数,则该函数就是规范构造函数。 - Vicente Romero
2个回答

67

说白了,你无法定义默认构造函数,因为只有在没有定义构造函数时编译器才会生成默认构造函数,因此,任何已定义的构造函数都不是默认构造函数。

如果你想让一个记录类型拥有无参构造函数,记录类型允许添加额外的构造函数或工厂方法,只要调用包含所有记录字段作为参数的“规范构造函数”即可。

public record Record(int recordId) {
   public Record() {
      this(0); 
   }
}

一个不带参数的构造函数被称为“默认构造函数”。编译器默认会创建一个默认构造函数。你可以提供另一种默认构造函数的实现方式,这样编译器就不再使用默认构造函数了。 - Marine Galantin
在C++中,由编译器创建的“默认”构造函数被称为“隐式声明”,请参见https://en.cppreference.com/w/cpp/language/default_constructor。 - Marine Galantin

33

显式构造函数

在您的情况下,如果您想要使用默认值委托到经典构造函数,您可以显式指定一个无参构造函数,方法如下 -

public Record(){
    this(Integer.MIN_VALUE);
}

简而言之,任何非规范构造函数都应该委托给一个构造函数,并且对于这些表示形式的数据承载性质也应该成立。

紧凑构造函数

另一方面,请注意您在代码中使用的表示形式。

public Record {}

紧凑构造函数被称为“紧凑构造函数”,它表示接受所有参数的构造函数,并且还可以用于验证记录属性提供的数据。 紧凑构造函数是声明规范构造函数的另一种方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接