在我的代码中,我发现我的方法可能会返回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")
}
你觉得在这里使用elvis运算符怎么样?它对你来说更可读吗?或者有人能提出更好的解决方案吗?
4条答案
按热度按时间mhd8tkvw1#
当然,这是一个偏好和风格的问题,但我不喜欢它。目标不是获得最少的代码行或最短的代码行。目标应该是以简洁的表达性代码结束。这通常是简短的,但简洁不是主要目标。我认为
q1.poll() ?: q2.poll() ?: exception()
对人类来说不是特别容易解析。ohfgkhjo2#
我同意Jeff的观点,这段代码有点难以阅读和理解。我的理由是它隐藏了真正发生的事情。当然,你可以通过改进方法名(比如
throwNewRuntimeException
),甚至把消息作为参数来让它更清楚。但我还是不喜欢它。感觉没有必要为此添加一个新方法。我会把它写成
regularMethod
,或者把它写成这样:在这个版本中,我认为它的意思很清楚,也很容易理解。作为一个额外的好处,你已经摆脱了那些看起来让你烦恼的混乱。甚至错误信息也更具有描述性。
bfnvny8b3#
guava preconditions怎么样?它们是java,所以也适合groovy。
或使用静态导入
e0uiprwp4#
请考虑:
优点:
exception()
的真正含义。