gpt4 book ai didi

java - 为什么 Java 记录的规范构造函数没有比记录级别更严格的访问权限?

转载 作者:行者123 更新时间:2023-12-04 04:28:50 25 4
gpt4 key购买 nike

我有一种情况,我希望特定类型的记录实例只能使用同一包内的单独类中的工厂方法创建。这样做的原因是因为在创建记录之前我需要执行大量的验证。
记录旨在成为其验证字段的哑数据载体,但验证不能在记录的构造函数中进行,因为我们需要访问一些复杂的 validator 对象才能实际执行验证。
由于将 validator 对象传递给记录构造函数意味着它们将构成记录状态的一部分,这意味着我们不能使用记录构造函数来执行记录的验证。
因此,我将验证提取到它自己的工厂中并编写了类似这样的代码(工厂类和同一包中的记录):

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)
我可以通过使用普通类(它允许单个包私有(private)构造函数)来避免这个问题,但希望更准确地将数据建模为记录。
为什么对记录存在此限制? future 是否有计划取消此限制?

最佳答案

我在琥珀邮件列表 (http://mail.openjdk.java.net/pipermail/amber-dev/2020-December.txt) 上提出了这个问题。
提出了这个问题:

What exactly is the reason that the canonical constructor must have thesame access as the record?


给出的答案是(重点是我的):

Records are named tuples, they are defined only by their components, in a transparent manner i.e. no encapsulation. From a tuple, you can access to the value of each component and from all component values, you can create a tuple.The idea is that, in a method, if you are able to see a record, you can create it. Thus the canonical constructor has the same visibility as the record itself.


因此,存在限制以符合设计目标和事实,即如果有人拥有记录的实例,他们应该能够解构它,然后使用规范构造函数重建它。当然,作为必然结果,这需要规范构造函数具有与记录本身相同的访问权限。

关于java - 为什么 Java 记录的规范构造函数没有比记录级别更严格的访问权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64903887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com