使用elvis运算符抛出异常Groovy

使用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

在我的代码中,我发现我的方法可能返回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(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