2017-01-26 8 views
-2

는이 코드가 있습니다새로운 연산자로 3 항 연산자를 사용하는 방법은 무엇입니까?

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-of-of) –

답변

4

이유식 연산자가 작동하지 않는 이유는 값을 지정하기 때문입니다. 의미 : ":"뒤에 "else"부분은 "?"뒤에 "then"경우와 같은 유형의 값을 반환해야합니다. 공급자 객체를 반환하지 않습니다

그리고 throw new ...

하지만, 그것은 어쨌든 중요하지 않습니다 결국

; 그 코드의 정말 간단 버전이 더 좋아 보이는 : 즉

checkProvidersNotEmpty(providers); 
this.providers = providers; 

:

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

this.providers = providers; 

하고 읽기 쉽게 일을하기 위해

, 당신도 갈 수 이동할 예외는 별도의 메소드에 던졌습니다. 여기서 암시 적 규칙은 확인이 실패 할 때 checkSomething()이라는 메서드가 예외를 throw한다는 것입니다. 그리고 그 너머 : 예외를 생성 할 때 합리적인 메시지를 제공하십시오. 나중에 디버깅을 도와줍니다.

가능한 가장 짧은 프로그램을 시도하지는 말고 ()을 가장 잘 읽는 것이 가장 좋습니다.

여기에서 삼항 연산자를 사용하면 이 아닌은 "읽기 쉽도록"사용하게됩니다. 따라서 : 그것에 대해 잊어 버려.

0

진술 문 throw new IllegalArgumentException()providers에 할당 할 수 없기 때문에 실제로는 그렇게 할 수 있다고 생각하지 않습니다. Java documentation about Equality, Relational, and Conditional Operators 가입일

:

조건부 연산자

가 [...]은 if-then-else 문 같이 속기 생각할 수있는 다른 조건 연산자 ?:이다 가합니다 (논의 이 과정의 흐름 설명 섹션 ). 이 연산자는 세 개의 피연산자를 사용하므로 세 번째 연산자로도 으로 알려져 있습니다. 다음 예에서이 연산자는 다음과 같이 읽어야합니다. " someConditiontrue 인 경우 value1의 값을 result에 할당하십시오.. 그렇지 않으면, 당신은 너무 할 수있는 "result

-1

value2의 값을 할당 :

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

을하지만, 일반적으로 당신은 그대로 같은 경우에 귀하의 코드를하도록해야한다는 점에서이다 을. case가 훨씬 더 복잡하고 덜 복잡하다