Lei*_*ngo 8 java optional preview-feature java-14 java-record
我真的很喜欢在 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);
}
}
Run Code Online (Sandbox Code Playgroud)
当我现在对记录尝试相同的模式时,不允许声明incorrect component accessor return type.
record MyRecord (String id, @Nullable String value){
Optional<String> value(){
return Optional.ofNullable(this.value);
}
}
Run Code Online (Sandbox Code Playgroud)
因为我认为Optional现在首选使用s 作为返回类型,所以我真的很想知道为什么会有这个限制。我对用法的理解有误吗?如何在不添加另一个带有不隐藏默认签名的签名的访问器的情况下实现相同的目标?如果Optional不是在这种情况下,在所有被使用?
Arecord包含主要定义其状态的属性。访问器、构造器等的推导完全基于记录的这种状态。
现在在您的示例中,属性的状态value是null,因此使用默认实现的访问最终会提供真实状态。为了提供对该属性的自定义访问,您需要寻找一个覆盖实际状态并进一步提供Optional返回类型的覆盖 API 。
当然,正如您提到的,其中一种处理方法是在记录定义本身中包含一个自定义实现
record MyClass(String id, String value) {
Optional<String> getValue() {
return Optional.ofNullable(value());
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以在单独的类中将读取和写入 API 与数据载体分离,并将记录实例传递给它们以进行自定义访问。
JEP 384 中最相关的引用:我发现的记录是(格式化我的):
一条记录声明它的状态——变量组——并提交到与该状态匹配的 API。这意味着记录放弃了类通常享有的自由——将类的 API 与其内部表示分离的能力——但作为回报,记录变得更加简洁。
由于对记录的限制,即规范构造函数类型需要与访问器类型匹配,使用Optional记录的一种实用方法是将其定义为属性类型:
record MyRecord (String id, Optional<String> value){
}
Run Code Online (Sandbox Code Playgroud)
有人指出,这是有问题的,因为 null 可能作为值传递给构造函数。这可以通过规范构造函数禁止此类不变量来解决MyRecord:
record MyRecord(String id, Optional<String> value) {
MyRecord(String id, Optional<String> value) {
this.id = id;
this.value = Objects.requireNonNull(value);
}
}
Run Code Online (Sandbox Code Playgroud)
在实践中,大多数常见的库或框架(例如 Jackson、Spring)都支持识别可选类型并Optional.empty()自动将 null 转换为空,因此这是否是一个需要在您的特定实例中解决的问题取决于上下文。我建议在你的代码库中研究对Optional的支持,然后再让你的代码变得混乱(可能是不必要的)。
| 归档时间: |
|
| 查看次数: |
1070 次 |
| 最近记录: |