为什么不能在参数中使用Java 8的可选性?
我在许多网站上阅读过,可选的应该仅作为返回类型使用,而不是在方法参数中使用。我很难找到合理的理由。例如,我有一个逻辑,它有两个可选的参数。因此,我认为这样写我的方法签名(解决方案1)是有意义的:public int calculateSomething(Optional p1, Optional p2 {
// my logic}
许多网页指定的可选参数不应用作方法参数。考虑到这一点,我可以使用以下方法签名并添加一个清晰的Javadoc注释来指定参数可能为null,希望未来的维护人员能够读取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}
现在,我尝试编写类的代码,它为每种方法调用这段逻辑。我首先从返回的另一个对象中检索两个输入参数。Optional然后,我调用calculateSomething..因此,如果使用解决方案1,则调用代码如下所示:Optional p1 = otherObject.getP1();Optional p2 = otherObject.getP2();int result = myObject.calculateSomething(p1, p2);
如果使用解决方案2,则调用代码如下所示:Optional p1 = otherObject.getP1();Optional p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1.orElse(null), p2.orElse(null));
如果应用了解决方案3,我可以使用上面的代码,也可以使用以下代码(但代码要多得多):Optional p1 = otherObject.getP1();Optional 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();
}}
所以我的问题是:为什么使用它被认为是不好的做法?Optionals作为方法参数(参见解决方案1)?在我看来,这是最容易读懂的解决方案,而且最明显的是,对于未来的维护人员来说,参数可能是空/空的。(我知道设计师们Optional只打算作为返回类型使用,但我找不到任何逻辑上的理由不使用它在这个场景中)。