【发布时间】:2020-10-29 03:01:31
【问题描述】:
有没有办法用 Java 记录做空对象?对于课程,我会这样做:
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);
}
但这感觉不对,而且容易出现并发问题。
我没有发现很多关于唱片背后的设计理念的讨论,这可能已经讨论过了。如果是这样保持简单,那是可以理解的,但感觉很尴尬,而且我已经在小样本中多次遇到过这个问题。
【问题讨论】:
-
(一个)记录的目的是不将 null 作为有效值,所以这个问题没有任何意义。
-
是这样吗?这就是我正在寻找的那种论证,但openjdk.java.net/jeps/359 根本没有提到这一点。我在不同的代码库中有很多值对象,记录可能很有用,但它们的局限性使它变得很尴尬。
-
也许你可以举一个“空”记录似乎是必要的例子?
-
既然您将
NULL_ID声明为static final,就不存在并发问题了。条件NULL_OBJECT != null只能在安全的类初始化器中评估为false。但这不是“空对象”设计模式。 Null Object 设计模式应该防止客户端代码遇到null引用相关的问题。但是您的record的id()方法仍然可能返回null,就像record允许null一样。 -
旁注:使用 Eclipse 的 ejc,第一个代码块是有效的 - 直到有人 fixed my bug
标签: java java-14 null-object-pattern java-record