|
|
1
2
不,在Java14中当前的记录定义中,您所需要的是不可能的。每个记录类型都有一个规范构造函数,可以隐式定义,也可以显式定义。每个非规范构造函数都必须从调用此记录类型的另一个构造函数开始。这基本上意味着,对任何其他构造函数的调用肯定会导致对规范构造函数的调用。 [8.10.4 Record Constructor Declarations in Java 14] 如果这个规范构造函数执行参数验证(它应该,因为它是公共的),那么您的选项是有限的。要么遵循前面提到的建议/解决方法,要么只允许用户通过接口访问API。如果选择最后一种方法,则必须从记录类型中删除参数验证并将其放入接口中,如下所示:
我不知道你的用例,所以这可能不是你的选择。但是,你想要的现在是不可能的。 JavaDoc for Records in Java 15 ,这似乎没有改变。我找不到真正的规范,JavaDoc中指向它的链接导致404,所以可能他们已经放宽了规则,因为有些人 complained about them . |
|
|
2
2
代码中的基本错误
有两个概念看似相似,甚至相同,但实际上并非如此。 这是 未知/未找到/不适用 概念。例如:
应该怎么办
别那么快-在你回答之前:好吧,也许吧
说这话
对于这样一个值(notfound/unknown/not applicable),java中没有任何内容比得上
然而,在使用记录了可能返回的api时,会经常发生什么
例如,如果我总是大写并修改学生姓名,并且有些ID已经映射到“not Enrolized Another”,并且这显示为已映射到空字符串,那么调用者就可以非常方便地希望
对于这个特定的用例
.
所以,既然我们已经确定了“空对象”不是您想要的,但是“空对象”是很好的选择,请注意它们应该很方便。调用者已经决定了他们想要的某些特定行为;他们明确地选择了这种行为。他们不想仍然要处理那些需要特殊处理的独特的价值观
您需要的大概是一个快速、不可变、易于访问的Id,并且Id.notnull有一个空字符串。像
您可能需要空值具有特定的行为。例如,有时您希望空对象也具有唯一的属性;其他Id实例都不能被视为与它相等。 你可以用两种方法来解决这个问题:
我认为“隐藏的布尔”足够明显。一个私有布尔字段,私有构造函数可以将其初始化为true,所有可公开访问的构造函数都设置为false。 使用空作为标识有点棘手。例如,它看起来像这样:
|