2012-02-26 16 views
38

Zastanawiałem się, czy można wykonać operację trójskładnikową, ale bez zwracania czegokolwiek.Java: Ternary bez powrotu. (Do wywoływania metod)

Jeśli nie jest to możliwe w języku Java, czy jest to możliwe w innych językach, jeśli tak, które z nich mają zastosowanie?

name.isChecked() ? name.setChecked(true):name.setChecked(false); 
+1

Jest to możliwe w JavaScripcie, na przykład tutaj: http://stackoverflow.com/a/6260001/320399 – blong

Odpowiedz

40

Nie, nie możesz. Ale jaki jest sens tego nad stwierdzeniem if-else? Czy naprawdę chcesz zapisać 7 znaków?

if (name.isChecked()) { 
    name.setChecked(true); 
} else { 
    name.setChecked(false); 
} 

lub jeśli wolisz zły styl:

if (name.isChecked()) name.setChecked(true); else name.setChecked(false); 

Nieważne fakt, że można po prostu zrobić (w tym przypadku):

name.setChecked(name.isChecked()); 

punktu trójskładnikowego lub " "operator warunkowy" to wprowadzenie warunkowych do wyrażenia :. Innymi słowy, to:

int max = a > b ? a : b; 

ma być skrótem dla tego:

int max; 
if (a > b) { 
    max = a; 
} else { 
    max = b; 
} 

Jeśli nie ma wartości są produkowane, operator warunkowy nie jest skrót.

0

w Javie następującego kodu nie jest możliwe:

(your-condition) ? (true-statements) : (false-statements) 

dla próbki nie można skompilować następujący kod snipet:

(1==1) ? System.out.println("") : System.out.println(""); 

osiągnąć następujący błąd kompilacji:

The left-hand side of an assignment must be a variable 
+0

'(twój warunek)? (true-statement): (false-statement) 'jest możliwe w java, ale musi zwrócić wartość (nie może być nieważna) i musisz przypisać ją do zmiennej. – jalv1039

5

Czasami można użyć operacji trójskładnikowej na argumentach metody, aby rozwiązać żądanie.

name.setChecked(name.isChecked() ? true : false); 

przy okazji najlepsze rozwiązanie dla Twojej peoblem jest

name.setCecked(name:isChecked()); 
10

I was wondering if it was possible to do a ternary operation but without returning anything.

Nie, to nie jest możliwe:

  1. 2 i 3 argumenty muszą być niepalne -nie wyrażenia; tj. muszą wytworzyć pewną rzeczywistą wartość.

    "It is a compile-time error for either the second or the third operand expression to be an invocation of a void method." - JLS 15.25 .

  2. Wyrażenie potrójne jest wyrażeniem i nie może być używane jako wypowiedź.

    "Certain kinds of expressions may be used as statements by following them with semicolons." ... and the ternary expression is not one of those kinds - JLS 14.8 .

Jeśli naprawdę chcesz używać potrójny wyraz, ale nie używać wartość wyrażenia, a następnie najprostszą rzeczą jest przypisanie wartości do zmiennej manekina i dodać adnotację do tłumienia ostrzeżenie o tym, że zmienna nie jest używana.

Ale lepszym pomysłem jest użycie zwykłego oświadczenia if.

If it's not possible in Java is it possible in other languages, if so which ones apply?

jestem nieco zardzewiały, ale wierzę, że C, C++ i Perl wszystkim umożliwiają dowolne wyrażenia być stosowany w miejscach, w których nie stosuje się ich wartości.

0

Musisz zwrócić pewną wartość i nie zadziała, jeśli chcesz, aby działała jak próżnia, która wykonuje pewne działanie bez zwracania wartości.

Nadzieja to pomaga ...

+0

To pytanie już znajduje się w trybie odpowiedzi. Proszę [przeczytaj FAQ, aby dowiedzieć się, jak poprawnie zadawać pytania] (http://stackoverflow.com/help/how-to-ask). – zuazo