使用elvis运算符抛出异常Groovy
在我的代码中,我发现我的方法可能返回null。在这种情况下,我宁愿抛出异常也不愿返回null。 然而,我不想使用常规if,因为在我看来它看起来很糟糕。见代码:使用elvis运算符抛出异常Groovy,groovy,Groovy,在我的代码中,我发现我的方法可能返回null。在这种情况下,我宁愿抛出异常也不愿返回null。 然而,我不想使用常规if,因为在我看来它看起来很糟糕。见代码: class Type{} @Field Queue<Type> q1 = [] as Queue @Field Queue<Type> q2 = [] as Queue Type regularMethod(){ Type toReturn = q1.poll() ?: q2.poll() if
class Type{}
@Field Queue<Type> q1 = [] as Queue
@Field Queue<Type> q2 = [] as Queue
Type regularMethod(){
Type toReturn = q1.poll() ?: q2.poll()
if(toReturn == null)
throw new RuntimeException("was null value")
return toReturn
}
Type myMethod(){
return q1.poll() ?: q2.poll() ?: exception()
}
Type exception(){
throw new RuntimeException("was null value")
}
类类型{}
@字段队列q1=[]作为队列
@字段队列q2=[]作为队列
类型regularMethod(){
键入toReturn=q1.poll()?:q2.poll()
if(toReturn==null)
抛出新的RuntimeException(“was null值”)
返回返回
}
类型myMethod(){
返回q1.poll()?:q2.poll()?:异常()
}
类型异常(){
抛出新的RuntimeException(“was null值”)
}
你觉得在这里使用elvis操作符怎么样?
你觉得它更可读吗?
或者有人能提出更好的解决方案吗?这当然是偏好和风格的问题,但我不喜欢。目标不是获得最少的代码行或最短的代码行。目标应该是以简洁的表达代码结束。这通常是简短的,但简洁并不是首要目标。我认为
q1.poll()?:q2.poll()?:exception()
对于人类来说不是特别容易解析。我同意Jeff的观点,阅读和理解代码有点困难。我的理由是它隐藏了真正发生的事情。当然,您可以通过改进方法名(改为类似于throwNewRuntimeException的throwNewRuntimeException
)甚至将消息作为一个参数来更清楚地说明这一点。但我还是不喜欢。感觉没有必要为此添加新方法
我要么完全按照您的常规方法编写,要么像这样将其扭转:
Type alternativeMethod() {
if (q1.empty && q2.empty)
throw new RuntimeException('Both queues are empty')
return q1.poll() ?: q2.poll()
}
在这个版本中,我认为它的意思是清楚易懂的。作为奖励,你已经摆脱了那些似乎困扰你的杂乱。甚至错误信息也更具描述性。番石榴呢?它们是java,因此也适用于groovy
Preconditions.checkArgument((q1 && q2, "was null value")
或者使用静态导入
checkNotNull(q1 && q2, "was null value")
谢谢你的回复,我可能会说得更多。你把我弄倒在地。然而我也在考虑注释。比如@ThrowAtNull