gpt4 book ai didi

具有可为空组件的 Java 记录

转载 作者:行者123 更新时间:2023-12-01 13:59:11 25 4
gpt4 key购买 nike

我真的很喜欢在 Java 14 中添加记录,至少作为预览功能,因为它有助于减少我将 lombok 用于简单、不可变的“数据持有者”的需要。但是我在实现可空组件时遇到了问题。我试图避免返回 null在我的代码库中指示可能不存在值。因此,我目前经常在 lombok 中使用类似以下模式的内容。

@Value
public class MyClass {
String id;
@Nullable String value;

Optional<String> getValue() { // overwrite the generated getter
return Optional.ofNullable(this.value);
}
}
当我现在对记录尝试相同的模式时,不允许声明 incorrect component accessor return type .
record MyRecord (String id, @Nullable String value){
Optional<String> value(){
return Optional.ofNullable(this.value);
}
}
因为我想到了 Optional 的用法s 作为现在首选的返回类型,我真的很想知道为什么要设置此限制。我对用法的理解有误吗?如何在不添加另一个带有不隐藏默认签名的签名的访问器的情况下实现相同的目标?应 Optional在这种情况下根本不使用?

最佳答案

一个 record包括主要定义其状态的属性。访问器、构造器等的推导完全基于记录的这种状态。
现在在您的示例中,属性的状态 valuenull ,因此使用默认实现的访问最终会提供真实的状态。为了提供对该属性的自定义访问,您需要寻找一个覆盖实际状态的 API 并进一步提供 Optional返回类型。
当然,正如您提到的,其中一种处理方法是在记录定义本身中包含一个自定义实现

record MyClass(String id, String value) {

Optional<String> getValue() {
return Optional.ofNullable(value());
}
}
或者,您可以在单独的类中将读取和写入 API 与数据载体分离,并将记录实例传递给它们以进行自定义访问。
最相关的报价来自 JEP 384: Records我发现将是(格式化我的):

A record declares its state -- the group of variables -- and commitsto an API that matches that state. This means that records give up afreedom that classes usually enjoy -- the ability to decouple aclass's API from its internal representation -- but in return, recordsbecome significantly more concise.

关于具有可为空组件的 Java 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62945049/

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