我在许多网站上读到过,Optional应该只用作返回类型,而不是在方法参数中使用.我正在努力寻找一个合乎逻辑的原因.例如,我有一个逻辑,它有两个可选参数.因此,我认为这样写我的方法签名是有意义的(解决方案1):

public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 {
    // my logic
}

许多网页指定Optional不应用作方法参数.考虑到这一点,我可以使用以下方法签名并添加明确的Javadoc注释来指定参数可以为空,希望将来的维护人员将读取Javadoc,从而在使用参数之前始终执行空判断(解决方案2):

public int calculateSomething(String p1, BigDecimal p2) {
    // my logic
}

或者,我可以用四个公共方法替换我的方法,以提供更好的接口,并使p1和p2更明显是可选的(解决方案3):

public int calculateSomething() {
    calculateSomething(null, null);
}

public int calculateSomething(String p1) {
    calculateSomething(p1, null);
}

public int calculateSomething(BigDecimal p2) {
    calculateSomething(null, p2);
}

public int calculateSomething(String p1, BigDecimal p2) {
    // my logic
}

现在,我try 编写类的代码,为每种方法调用这段逻辑.我首先从另一个返回Optionals的对象中检索两个输入参数,然后调用calculateSomething.因此,如果使用解决方案1,调用代码如下所示:

Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1, p2);

如果使用解决方案2,调用代码如下所示:

Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1.orElse(null), p2.orElse(null));

如果应用了解决方案3,我可以使用上面的代码,也可以使用下面的代码(但代码要多得多):

Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result;
if (p1.isPresent()) {
    if (p2.isPresent()) {
        result = myObject.calculateSomething(p1, p2);
    } else {
        result = myObject.calculateSomething(p1);
    }
} else {
    if (p2.isPresent()) {
        result = myObject.calculateSomething(p2);
    } else {
        result = myObject.calculateSomething();
    }
}

So my question is: Why is it considered bad practice to use 100s as method arguments (see solution 1)?在我看来,这是最具可读性的解决方案,而且对于future 的维护人员来说,参数可能是空的/空的.(我知道Optional的设计者打算只将其用作返回类型,但我找不到任何逻辑理由不在这种情况下使用它).

推荐答案

哦,那些编码风格是要有点保留的.

  1. (+)将可选结果传递给另一个方法,而不进行任何语义分析;让方法来决定,这是很好的.
  2. (-)在方法中使用导致条件逻辑的可选参数实际上是适得其反的.
  3. (-)需要将参数打包为可选参数,这对编译器来说是次优的,并且需要进行不必要的包装.
  4. (-)与可空参数相比,可选参数的成本更高.
  5. (-)有人在实际参数中将可选参数作为null传递的风险.

总的来说:可选统一了两个州,这两个州必须分开.因此,由于数据流的复杂性,结果比输入更适合.

Java相关问答推荐

JPackage-results已安装-如何添加系统属性?

具有默认分支的JUnit代码覆盖率切换声明

更新我们的一个文物后出现了严重的符号引用错误

为什么如果数组列表中有重复项,我的代码SOMETIMES不返回true?

根据对象和值的参数将映射<;T、值&>转换为列表<;T&>

Hibernate 6支持Joda DateTime吗?

在AVL树的Remove方法中使用NoSuchElementException时遇到问题

按属性值从流中筛选出重复项

如何使用log4j2(Json)记录由";异常引起的所有";?

在Java中将int[]矩阵添加到ArrayList中,但出现错误

如何在JavaFX中制作鼠标透明stage

是否在settings.xml中使用条件Maven镜像?

Oj算法 MatrixR032从字符串、归一化和余弦相似度计算创建

如何在Java springboot中从一个端点发送多个时间响应?

Java中HashSet的搜索时间与TreeSet的搜索时间

具有最大共同前景像素的图像平移优化算法

没有Tomcat,IntelliJ如何在本地运行API?

本机方法(JNI)总是编译的吗?

读取ConcurrentHashMap中的可变对象

Eureka客户端无法使用用户/通行证注册到Eureka服务器