2017-01-26 27 views
-2

我有这样的代码:如何使用新的三元运算符?

if (providers.length > 0) 
     this.providers = providers; 
    else 
     throw new IllegalArgumentException(); 

,我想简化它。我去了:

(providers.length > 0) ? this.providers = providers : throw new IllegalArgumentException(); 

但是,这给了我一个编译器错误。为什么?

+3

这不是“简化”,有些模糊,易读性差 – luk2302

+0

三元运算符的语法是'condition?value1:value2'。'throw'语句不是一个值。 e三元运算符不是“if”语句的通用简写形式。 – khelwood

+0

[可以使用Java的三元/条件运算符(?:)来调用方法而不是赋值?](http://stackoverflow.com/questions/12554547/can-javas-ternary-conditional-operator-be -used-to-call-methods-instead-of) –

回答

4

三元运算符不工作的原因是因为指定了值。含义:“:”后的“else”部分需要在“?”后返回与“then”相同类型的值。

而且throw new不返回供应商对象...

但最终,这并不怎样都无所谓;作为很简单版本的代码看起来更像:

if (providers.length == 0) { 
    throw new IllegalArgumentException(); 
} 

this.providers = providers; 

而且为了使事情更容易阅读,你甚至可以去:

checkProvidersNotEmpty(providers); 
this.providers = providers; 

换句话说:你移动抛出一个单独的方法的异常。 隐含的这里的约定是,当检查失败时,名为checkSomething()的方法会引发异常。除此之外:创建该异常时给出合理的消息。它帮助稍后调试。

您不会争取最短的程序,但对于最好的阅读经验的最短的版本。

这里使用三元运算符而不是导致“易于阅读”体验。因此:忘了它。

0

我不认为你可以这样做,因为throw new IllegalArgumentException()不能被分配到providers

Java documentation about Equality, Relational, and Conditional Operators

的条件运算符

[...] 另一个条件运算符是?:,其可用于if-then-else语句被认为是 速记的(在所讨论的控制 本课的流量表部分)。该运算符也被称为 作为三元运算符,因为它使用三个操作数。在下面的示例中,该运算符应该被读作:“如果 someConditiontrue,则将值value1指定为result。 否则,value2值分配给result

-1

你可以做到这一点。

this.providers = providers.length > 0 ? providers : null; 
if (this.providers == null) 
    throw new IllegalArgumentException(); 

但通常你应该让你的代码在这样的情况下,因为它是 这是一个在这一点。这种情况要好得多,也不那么复杂