2012-09-23 1 views
25

http://en.wikipedia.org/wiki/?:과 같은 페이지에서는 조건부 지정에 삼항/조건부 연산자 ?:이 사용 된 것 같습니다. 다음과 같이 메서드 호출에 사용하려고했습니다.Java의 삼항/조건부 연산자 (? :)를 사용하여 값을 할당하는 대신 메소드를 호출 할 수 있습니까?

(condition) ? doThis() : doThat(); 

두 메서드 모두 void를 반환합니다. 자바는 그것이 진술이 아니라고 말한다.

그래서 조건부 메서드 호출을 수행 할 수 없다고 추측합니다 ... 아니면 할 수 있습니까?

+14

아니요. 정상적인 사람처럼'if'를 사용하십시오. –

+1

삼항 연산자는 조건 검사와 함께 유형의 인스턴스에 값을 할당한다고 가정합니다. 당신이 그것을 제안하는 방식은 형식을 만족시키지 못합니다. –

+0

@codeparkle - 많은 공간이 아닙니다. if (condition) {doThis();} else {doThat();} – tehdoommarine

답변

18

이 경우에는 3 진 연산자를 메서드로 생각하십시오. a ? b : c을 말하는 것은 (lasseespeholt의 의견을 참조 의도와 당신이 고려하고 목적을 위해) 의사 코드 메소드 호출하는 것과 같습니다 :

ternary(a, b, c) 
    if a 
     return b 
    else 
     return c 

명이 x = a ? b : c 같은 것들을 말할 수있는 이유는; 그것은 기본적으로 x = ternary(a, b, c)을 말하는 것과 같습니다. 당신이 (condition) ? doThis() : doThat()을 말할 때, 당신은 말 효과에있어 : ​​우리는 그들이 그것도 감각을 고려하지 않습니다

if condition 
    return ??? 
else 
    return ??? 

반환 무엇을 방법을 대체하려고하면 어떻게되는지

if condition 
    return doThis() 
else 
    return doThat() 

봐 . doThis()doThat()void이 인스턴스화 할 수없는 유형이기 때문에 아무 것도 반환하지 않으므로 ternary 메서드는 아무 것도 반환 할 수 없으므로 Java가 사용자의 진술과 관련하여 무엇을해야하는지 알지 못하고 불만을 제기합니다.

여기에는 여러 가지 방법이 있지만 모두 나쁜 습관입니다 (반환 값을 갖도록 메서드를 수정할 수는 있지만 반환 값을 사용하지 않으면 메서드를 호출 한 다음 새 메서드를 만들 수 있습니다. 반환 널 등). 이 경우 if 문을 사용하는 것이 훨씬 낫습니다.

EDIT 또한 더 큰 문제가 있습니다. 값을 반환하더라도 Java는 어떤 의미에서든 진술을 a ? b : c으로 간주하지 않습니다.

+1

"? b : c를 쓰는 것은 의사 코드 메소드"<- Nope를 호출하는 것과 같습니다. 'b' 또는'c'가 부작용이있는 상황을 고려하십시오. 따라서 나중에 예제 에서처럼 람다로 간주해야합니다. –

+0

참. 나는 내가 단순화하고 있음을 분명히 할 것이다. – Jodaka

+3

@Jodaka, 나는 당신의 편집을 정답으로 생각한다. 왜냐하면 그것은 값을 반환하는 것이 아니기 때문이다. 자바에 대해서는 고려하지 않는다. b : c를 진술로 사용합니다. – Kareem

2

이진 연산자는 구문 설탕입니다.
코드가 읽기/쓰기가 쉬워 지지만 실제 기능은 추가하지 않습니다.
주된 용도는 몇 줄의 코드를 한 줄로 압축하는 것이었고, 약간의 조건에 따라 약간 다른 문자열을 만들 때 매우 유용했습니다.

예 : 대신

Collection<?> col = ... 
String message = "There "; 
if(col.size()==1) 
    message += "is"; 
else 
    message += "are"; 
message += " "+col.size() 
if(col.size()==1) 
    message += " element"; 
else 
    message += " elements"; 
message += " in the collection"; 
System.out.println(message); 

당신이 볼 수 있듯이의

Collection<?> col = ... 
System.out.println("There " + (col.size()==1 ? "is" : "are") + " " 
    + col.size() + " " + (col.size()==1 ? "element" : "elements") 
    + " in the collection"); 

, 그것은 코드를 단순화합니다.
은 (주 : 두 번째 예에서는 대신 문자열 연결의 StringBuilder를 사용하는 것이 더 좋습니다)하지 않고, 같은 일을 작성하는 두 가지 방법 if(condition) doThis(); else doThat();와 같은 의미가있을 것이라고했다

그러나 (condition) ? doThis() : doThat(); 이후 (반환 값 없음) 기능을 추가합니다.프로그래머를위한

  • : 그것은 단지 일을 복잡하게 할 코드는 삼항 연산자의 이행을위한 균일 한
  • 되지 않습니다 : 그것은 지금 또한 지원이 void 방법

그래서 이 아닌 경우 조건부 메서드 호출에 대해 삼항 연산을 사용할 수 없습니다. if-else를 대신 사용하십시오 :

if(condition) 
    doThis(); 
else 
    doThat(); 
1

3 진 (조건부) 연산자는 값을 반환합니다. 귀하의 방법이 그렇지 않다면, 그들은 가치를 취하는 운영자의 일부로서 사용될 수 없습니다.

더 잘 이해하기 위해 간단한 이진 연산자 인 +을 생각해 봅시다. 이 방법으로 작동합니다 :

<eval1> + <eval2> --> <value> 

2 개의 평가 가능한 부품이 필요하며 다른 부품을 반환합니다. 당신이

doThis() + doThat(); 

또는

gimmeAValue = doThis() + doThat(); 

는 실패를 입력 한 경우 doThis()doThat()도 아무것도으로 평가로 (그들은 "반환"void). 물론 <eval1><eval2>은 모두 + 연산자가 처리하고 어떤 유형의 값을 반환 할 수 있도록 일부 "호환"유형이어야합니다.

이제 삼항 연산자를 살펴 보자 :

<evalBoolean> ? <eval1> : <eval2> --> <value> 

은 3 개 평가가 부품을 소요하고 값을 반환합니다.

첫 번째 평가할 수있는 부분은 컴파일러가 부울로 이해할 수 있어야합니다 (캐스팅 가능). 다른 2 개의 평가 가능한 부품 중 어느 것이 반환되어야하는지 결정하는 데 사용됩니다.

다른 두 개의 평가 가능한 부품은 반드시 ... 평가 가능해야합니다. 무언가에. 어떤 타입의.

즉, 삼항 조건부 연산자는 코드 분기가 아닌 무언가를 반환하기위한 것입니다. 다음과 같이 사용 :

관련 문제