使用elvis运算符抛出异常Groovy

时间:2014-05-23 15:03:23

标签: groovy

在我的代码中,我发现我的方法可以返回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运营商? 它对你来说更具可读性吗? 或者任何人都可以建议更好的解决方案?

3 个答案:

答案 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")