在我的代码中,我发现我的方法可以返回null的情况。在这种情况下,我宁愿抛出异常而不是返回null。 但是我不想使用常规,因为在我看来它看起来很糟糕。见代码:
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")
}
您如何看待在这里使用elvis运营商? 它对你来说更具可读性吗? 或者任何人都可以建议更好的解决方案?
答案 0 :(得分:3)
这当然是偏好和风格的问题,但我不喜欢它。目标不是获得最少的代码行或最短的代码行。目标应该是以简洁的表达代码结束。这往往是简短的,但简洁不是主要目标。我认为q1.poll() ?: q2.poll() ?: exception()
对于人类来说并不是特别容易解析。
答案 1 :(得分:1)
我同意杰夫的意见,这有点难以阅读和理解代码。我的理由是它隐藏了真正发生的事情。您当然可以通过改进方法名称(类似throwNewRuntimeException
)来更清楚,甚至可以将消息作为参数。但我仍然不喜欢它。为此添加新方法是不必要的。
我要么像你的regularMethod
一样把它写成,要么像这样把它翻过来:
Type alternativeMethod() {
if (q1.empty && q2.empty)
throw new RuntimeException('Both queues are empty')
return q1.poll() ?: q2.poll()
}
在这个版本中,我认为其含义清晰易懂。作为奖励,你已经摆脱了似乎困扰你的混乱。甚至错误信息也更具描述性。
答案 2 :(得分:0)
番石榴preconditions怎么样?它们是java,所以它们也适合groovy。
Preconditions.checkArgument((q1 && q2, "was null value")
或使用静态导入
checkNotNull(q1 && q2, "was null value")