gpt4 book ai didi

Java 记录和空对象模式?

转载 作者:行者123 更新时间:2023-12-01 09:59:50 24 4
gpt4 key购买 nike

有没有办法用 Java 记录做空对象?对于类(class),我会这样做:

public class Id {

public static final Id NULL_ID = new Id();

private String id;

public Id(String id) {
this.id = Objects.requireNonNull(id);
}

private Id() {}
}
但这不起作用,因为每个构造函数都需要通过规范的( Id(String id ),而我不能只调用 super()绕过不变量。
public record Id(String id) {
public static final Id NULL_ID = null; // how?

public Id {
Objects.requireNonNull(id);
// ...
}
}
现在我解决了这个问题
public Id {
if (NULL_OBJECT != null)
Objects.requireNonNull(id);
}
但这感觉不对,并且容易出现并发问题。
我还没有发现很多关于记录背后的设计思想的讨论,这可能已经讨论过了。如果像这样保持简单,那是可以理解的,但感觉很尴尬,我已经在小样本中多次遇到这个问题。

最佳答案

不,Java 14 中当前的记录定义无法满足您的需求。每个记录类型都有一个规范的构造函数,隐式或显式定义。每个非规范构造函数都必须以调用此记录类型的另一个构造函数开始。这基本上意味着,对任何其他构造函数的调用肯定会导致对规范构造函数的调用。 [8.10.4 Record Constructor Declarations in Java 14]
如果此规范构造函数执行参数验证(它应该这样做,因为它是公开的),则您的选择是有限的。要么遵循已经提到的建议/解决方法之一,要么只允许用户通过接口(interface)访问 API。如果选择最后一种方法,则必须从记录类型中删除参数验证并将其放入接口(interface)中,如下所示:

public interface Id {
Id NULL_ID = new IdImpl(null);

String id();

static Id newIdFrom(String id) {
Objects.requireNonNull(id);
return new IdImpl(id);
}
}

record IdImpl(String id) implements Id {}
我不知道你的用例,所以这可能不是你的选择。但同样,你想要的现在是不可能的。
关于 Java 15,我只能找到 JavaDoc for Records in Java 15 ,这似乎没有改变。我找不到实际的规范,JavaDoc 中指向它的链接导致 404,所以也许他们已经放宽了规则,因为有些人 complained about them .

关于Java 记录和空对象模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62799232/

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