レコードのデフォルトコンストラクターを定義する


20

レコードがあり、それにデフォルトのコンストラクターを追加したい。

public record Record(int recordId) {
   public Record {

   }
}

しかし、それはintparamでコンストラクタを作成しました。

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

レコードに既定のコンストラクターを追加するにはどうすればよいですか?


定義したのは、レコードヘッダーから派生した宣言を取得するコンパクトコンストラクターです。レコードコンポーネントとコンパクトコンストラクターの対応する仮パラメーターの間で、名前、型、変数のアリティが1-1で一致しています。これは、正規コンストラクターにも当てはまります。レコードは正規コンストラクターのみを持つことができます。宣言した場合は、コンパクトなコンストラクタは、標準的なコンストラクタです
ビセンテ・ロメロ

回答:


18

ヘアを分割するために、デフォルトコンストラクターを定義することはできません。デフォルトコンストラクターは、コンストラクターが定義されていない場合にコンパイラーによって生成されるため、定義されたコンストラクターはデフォルトではデフォルトコンストラクターではありません。

レコードに引数のないコンストラクターが必要な場合は、すべてのレコードフィールドを引数として取る「正規コンストラクター」が呼び出される限り、レコードでコンストラクターやファクトリーメソッドを追加できます。

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

17

明示的なコンストラクタ

あなたのケースでは、必要に応じて、デフォルト値を持つ正規コンストラクタへの委任で引数なしのコンストラクタを明示的に指定できます。これは次のように行うことができます-

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

つまり、非標準コンストラクタは1つに委任する必要があり、これらはこれらの表現のデータを保持する性質に当てはまるはずです。

コンパクトコンストラクタ

一方、コードで使用した表現に注意してください。

public Record {}

すべての引数を受け入れるコンストラクターを表す「コンパクトコンストラクター」と呼ばれ、レコードの属性として提供されるデータを検証するためにも使用できます。コンパクトコンストラクターは、正規コンストラクターを宣言する代替方法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.