使用elvis运算符抛出异常Groovy

jogvjijk  于 2022-11-01  发布在  其他
关注(0)|答案(4)|浏览(188)

在我的代码中,我发现我的方法可能会返回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运算符怎么样?它对你来说更可读吗?或者有人能提出更好的解决方案吗?

mhd8tkvw

mhd8tkvw1#

当然,这是一个偏好和风格的问题,但我不喜欢它。目标不是获得最少的代码行或最短的代码行。目标应该是以简洁的表达性代码结束。这通常是简短的,但简洁不是主要目标。我认为q1.poll() ?: q2.poll() ?: exception()对人类来说不是特别容易解析。

ohfgkhjo

ohfgkhjo2#

我同意Jeff的观点,这段代码有点难以阅读和理解。我的理由是它隐藏了真正发生的事情。当然,你可以通过改进方法名(比如throwNewRuntimeException),甚至把消息作为参数来让它更清楚。但我还是不喜欢它。感觉没有必要为此添加一个新方法。
我会把它写成regularMethod,或者把它写成这样:

Type alternativeMethod() {
    if (q1.empty && q2.empty) 
        throw new RuntimeException('Both queues are empty')
    return q1.poll() ?: q2.poll()
}

在这个版本中,我认为它的意思很清楚,也很容易理解。作为一个额外的好处,你已经摆脱了那些看起来让你烦恼的混乱。甚至错误信息也更具有描述性。

bfnvny8b

bfnvny8b3#

guava preconditions怎么样?它们是java,所以也适合groovy。

Preconditions.checkArgument((q1 && q2, "was null value")

或使用静态导入

checkNotNull(q1 && q2, "was null value")
e0uiprwp

e0uiprwp4#

请考虑:

q1.poll() ?: q2.poll() ?: {throw new RuntimeException('Both empty')}()

优点:

  • 没有特殊的习语函数,读者必须知道exception()的真正含义。
  • 没有人们必须知道的共享库函数。
  • 只需使用惰性求值清除使用语言基元的代码。
  • 错误情况之前的值,从左到右读起来很正常。

相关问题