【问题标题】:Define default constructor for record为记录定义默认构造函数
【发布时间】:2020-07-23 21:55:27
【问题描述】:

我有一条记录,想给它添加默认构造函数。

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
}

我们如何向记录添加默认构造函数?

【问题讨论】:

  • 你定义的是一个紧凑的构造函数,它的声明来自记录头。记录组件与紧凑构造函数中对应的形参在名称、类型和变量数量上存在 1-1 匹配,这同样适用于规范构造函数。一条记录只能有一个规范的构造函数。如果声明紧凑构造函数是规范构造函数

标签: java java-14 java-record


【解决方案1】:

为了分叉,你永远不能定义默认构造函数,因为当没有定义构造函数时,编译器会生成默认构造函数,因此任何定义的构造函数都不是默认构造函数。

如果您希望记录具有无参数构造函数records do allow adding extra constructors or factory methods,只要调用将所有记录字段作为参数的“规范构造函数”即可。

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

【讨论】:

    【解决方案2】:

    显式构造函数

    在您的情况下,如果您愿意,您可以显式指定一个无参数构造函数,并委托给具有默认值的规范构造函数,这可以通过 -

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

    简而言之,任何非规范的构造函数都应该委托给一个,这应该适用于这些表示的数据承载性质。

    紧凑构造函数

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

    public Record {}
    

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

    【讨论】:

      猜你喜欢
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 2013-09-10
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      相关资源
      最近更新 更多