【发布时间】:2020-11-03 23:01:30
【问题描述】:
是否可以在 java 15 中实现类似的东西?
record Something(
SomeId id,
MyProp myProp,
MaybeProp maybeProp
){
public Something(SomeId id, MyProp myProp){
this(id, myProp, null);
}
public Optional<MaybeProp> maybeProp(){ //problematic line
return Optional.ofNullable(maybeProp);
}
}
这里我得到了异常
(return type of accessor method maybeProp() must match the type of record component maybeProp)
所以 - 我明白问题所在;但是还有其他解决方案吗?如何在记录中有可选成员,我不需要使用 Optional.of() 进行初始化?
【问题讨论】:
-
只是澄清一下-您希望记录字段作为参考,
null表示“不存在”,但您希望在用户请求值时将其返回为Optional?如果这是您的问题,那么答案是不可能隐藏或更改每个字段的自动生成的读取访问器的返回类型。您将需要一个具有不同名称的附加访问器,该访问器使用ofNullable返回Optional -
完全正确。这会起作用,只是有点难看。我想我还必须以某种方式禁用
maybeProp以便它不会被调用。 -
我将添加一个不同的建议作为答案
-
将 MaybeProp 的类型更改为 Optional
并在构造函数而不是 getter 中进行包装怎么样? -
记录的基本权衡是:您已经放弃了将 API 与表示分离的能力;用于构造和访问的 API 直接来自状态描述。所以不行。如果一个组件的类型是
T,那么它对应的访问器和规范构造函数参数的类型也将是T。 (但你可以有额外的构造函数。)
标签: java java-record java-15