特定のタイプのレコード インスタンスを、同じパッケージ内の別のクラスのファクトリ メソッドを使用してのみ作成できるようにしたい状況があります。その理由は、レコードを作成する前に、かなりの量の検証を実行する必要があるためです。
レコードは、検証されたフィールドのダム データ キャリアになることを意図していますが、実際に検証を実行するにはいくつかの精巧なバリデーター オブジェクトにアクセスする必要があるため、レコードのコンストラクターで検証を行うことはできません。
バリデータ オブジェクトをレコード コンストラクターに渡すことは、それらがレコード状態の一部を形成することを意味するため、レコード コンストラクターを使用してレコードの検証を実行できないことを意味します。
そこで、検証を独自のファクトリに抽出し、次のようなコードを作成しました (ファクトリ クラスと同じパッケージ内のレコード)。
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)
通常のクラス (単一のパッケージ プライベート コンストラクターを許可する) を使用することで問題を回避できますが、データをレコードとしてより正確にモデル化したいと考えています。
この制限がレコードに存在するのはなぜですか? 今後、この制限を撤廃する予定はありますか?