我有这段代码:
if (providers.length > 0)
this.providers = providers;
else
throw new IllegalArgumentException();
我想简化它。我去了:
(providers.length > 0) ? this.providers = providers : throw new IllegalArgumentException();
但这给了我一个编译器错误。为什么呢?
答案 0 :(得分:4)
三元运算符不起作用的原因是因为分配值。含义:“:”之后的“else”部分需要返回与“?”之后的“then”情况相同类型的值。
并且throw new
不会返回提供者对象...
但最后,这无关紧要;因为该代码的非常简单版本看起来更像:
if (providers.length == 0) {
throw new IllegalArgumentException();
}
this.providers = providers;
为了让事情更容易阅读,你甚至可以选择:
checkProvidersNotEmpty(providers);
this.providers = providers;
换句话说:将异常抛出移动到单独的方法中。这里的隐式约定是名为checkSomething()
的方法在检查失败时抛出异常。除此之外:在创建异常时给出合理的信息。 将稍后帮助调试。
您不会争取尽可能短的节目,而是为了获得最佳阅读体验的最短版本。
在这里使用三元运算符不会产生“易于阅读”的体验。因此:忘了它。
答案 1 :(得分:0)
Method Call using Ternary Operator
与Java相同,你必须返回相同类型的对象。
答案 2 :(得分:0)
我认为您实际上无法执行此操作,因为无法将throw new IllegalArgumentException()
语句分配给providers
。
来自Java documentation about Equality, Relational, and Conditional Operators:
条件运算符
[...] 另一个条件运算符是
?:
,可以将其视为if-then-else
语句的简写(在控件中讨论) 本课程的流程声明部分)。该运算符也是已知的 作为三元运算符,因为它使用三个操作数。在里面 下面的示例,此运算符应读作:" IfsomeCondition
为true
,将value1
的值指定给result
。 否则,请将value2
的值指定为result
。"
答案 3 :(得分:-1)
你也可以这样做:
this.providers = providers.length > 0 ? providers : null;
if (this.providers == null)
throw new IllegalArgumentException();
但通常你应该让你的代码在这样的情况下使用。 在那种情况下,情况要好得多,也不那么复杂。