我在许多网站上读到过,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 编写类的代码,为每种方法调用这段逻辑.我首先从另一个返回Optional
s的对象中检索两个输入参数,然后调用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
的设计者打算只将其用作返回类型,但我找不到任何逻辑理由不在这种情况下使用它).