为什么 Java 记录的规范构造函数不能比记录级别具有更严格的访问权限?
我有一种情况,我希望特定类型的记录实例只能使用工厂方法在同一包中的单独类中创建。这样做的原因是,在创建记录之前,我需要执行大量的验证。
该记录旨在成为其已验证字段的哑数据载体,但验证不能在记录的构造函数中进行,因为我们需要访问一些精心设计的验证器对象才能实际执行验证。
由于将验证程序对象传递给记录构造函数意味着它们将构成记录状态的一部分,这意味着我们不能使用记录构造函数来执行记录的验证。
因此,我将验证提取到它自己的工厂中,并编写了类似如下的代码(工厂类和同一包中的记录):
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)
我可以通过使用普通类(允许单个包私有构造函数)来避免这个问题,但希望更准确地将数据建模为记录。
为什么记录存在此限制?将来是否有任何计划取消此限制?