10

特定のタイプのレコード インスタンスを、同じパッケージ内の別のクラスのファクトリ メソッドを使用してのみ作成できるようにしたい状況があります。その理由は、レコードを作成する前に、かなりの量の検証を実行する必要があるためです。

レコードは、検証されたフィールドのダム データ キャリアになることを意図していますが、実際に検証を実行するにはいくつかの精巧なバリデーター オブジェクトにアクセスする必要があるため、レコードのコンストラクターで検証を行うことはできません。

バリデータ オブジェクトをレコード コンストラクターに渡すことは、それらがレコード状態の一部を形成することを意味するため、レコード コンストラクターを使用してレコードの検証を実行できないことを意味します。

そこで、検証を独自のファクトリに抽出し、次のようなコードを作成しました (ファクトリ クラスと同じパッケージ内のレコード)。

package some.package;

// imports.....

@Component
class SomeRecordFactory {
    private final SomeValidator someValidator;
    private final SomeOtherValidator someOtherValidator;
    // Rest of the fields
    // ....

    // constructor  
    // ....


    public SomeRecord create(...) {
         someValidator.validate(....);
         someOtherValidator.validate(....);
         // .... other validation

         return new SomeRecord(...);
    }
}
package some.package;

public record SomeRecord(...) {
    /* package-private */ SomeRecord {
    }
}

なんらかの理由で、上記はIntelliJの不平では機能しません:

Compact constructor access level cannot be more restrictive than the record access level (public)

通常のクラス (単一のパッケージ プライベート コンストラクターを許可する) を使用することで問題を回避できますが、データをレコードとしてより正確にモデル化したいと考えています。

この制限がレコードに存在するのはなぜですか? 今後、この制限を撤廃する予定はありますか?

4

2 に答える 2