java8为什么用不了_为什么不能在参数中使用Java 8的可选性?

为什么不能在参数中使用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只打算作为返回类型使用,但我找不到任何逻辑上的理由不使用它在这个场景中)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值