java 使用Optional.ofNullable()执行空检查是否总是反模式?[已关闭]

ibrsph3r  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(123)

已关闭。此问题为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进行空检查更多的是围绕maporElse方法,我认为这使得代码更容易阅读,比如更多声明性的东西,特别是因为有一些东西被返回(与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。
第一个选择不是更好吗?为什么会不好?

q8l4jmvw

q8l4jmvw1#

基于Brian Goetz的回答,Optional背后的想法是指示方法的返回值是否可以为空,并且我们应该限制它在上下文本身中的使用。
在您的示例中,第一个选项是理想的选项,但有些人认为它是反模式,因为它与Optional的意图相矛盾。
如果PersonDto返回一个Optional<Address>,可能是最好的。这样,任何使用此dto的人都知道地址可能为空,而不必花太多精力了解如何填充dto以及地址是否可以为空。
例如,

class PersonDto {
    private Address address;

    public Optional<Address> getAddress(){
        return Optional.ofNullable(address);
    }
}

这也将鼓励以函数样式的方式处理地址。

相关问题