已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。
3天前关闭。
Improve this question
我读到在这个问题的选择答案中使用Optional.ofNullable进行空检查是一个反模式:Optional as a Record Parameter in Java
答案的作者没有详细说明,所以我搜索了更多的内容,人们会用ifPresent
执行一些操作的例子来解释为什么使用optional而不是if是不好的(Should Optional.ofNullable() be used for null check?),我有点同意,但是,我使用optional进行空检查更多的是围绕map
和orElse
方法,我认为这使得代码更容易阅读,比如更多声明性的东西,特别是因为有一些东西被返回(与ifPresent
方法相反)。
一些例子:
选项1
Address address = Optional.ofNullable(personDTO.getAddress())
.map(this.addressMapper::fromDTO)
.orElse(null);
选项2
Address address = personDTO.getAddress() == null ?
null : this.addressMapper.fromDTO(personDTO.getAddress);
选项3
Address address;
if (personDTO.getAddress() != null) {
address = this.addressMapper.fromDTO(personDTO.getAddress);
} else {
address = null;
}
在这些例子中,地址将作为其他类(比如Person)的非必需构造函数参数发送,因此它可以为空。但是,我不能为addressMapper.fromDTO方法发送空值,因为例子中的代码负责决定如何处理地址的空输入值,地址Map器只是Map非空DTO。
第一个选择不是更好吗?为什么会不好?
1条答案
按热度按时间q8l4jmvw1#
基于Brian Goetz的回答,
Optional
背后的想法是指示方法的返回值是否可以为空,并且我们应该限制它在上下文本身中的使用。在您的示例中,第一个选项是理想的选项,但有些人认为它是反模式,因为它与
Optional
的意图相矛盾。如果
PersonDto
返回一个Optional<Address>
,可能是最好的。这样,任何使用此dto的人都知道地址可能为空,而不必花太多精力了解如何填充dto以及地址是否可以为空。例如,
这也将鼓励以函数样式的方式处理地址。