L’operatore ternario / condizionale di Java (? :) può essere usato per chiamare metodi invece di assegnare valori?

In pagine come http://en.wikipedia.org/wiki/ ?: l’operatore ternario / condizionale ?: Sembra essere usato per compiti condizionali. Ho provato ad usarlo per la chiamata al metodo, in questo modo:

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

Entrambi i metodi restituiscono nulla. Java mi dice che non è una dichiarazione.

Quindi, immagino di non poter fare chiamate al metodo condizionale … o posso?

Pensa agli operatori ternari come un metodo in questo caso. Dire a ? b : c a ? b : c è (per gli scopi e le considerazioni che stai considerando, vedi il commento di lasseespeholt) equivalente a chiamare il metodo pseudocode:

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

ed è per questo che le persone possono dire cose come x = a ? b : c x = a ? b : c ; è fondamentalmente come dire x = ternary(a, b, c) . Quando dici (condition) ? doThis() : doThat() (condition) ? doThis() : doThat() , stai dicendo in effetti:

 if condition return doThis() else return doThat() 

Guarda cosa succede se proviamo a sostituire i metodi per quello che restituiscono

  if condition return ??? else return ??? 

Non ha nemmeno senso considerarlo. doThis() e doThat() non restituiscono nulla, perché il void non è un tipo istantaneo, quindi il metodo ternary non può restituire nulla, quindi Java non sa cosa fare con la propria affermazione e si lamenta.

Ci sono modi per aggirare questo, ma sono tutte cattive pratiche (puoi modificare i tuoi metodi per avere un valore di ritorno ma non fare nulla con ciò che restituiscono, potresti creare nuovi metodi che chiamano i tuoi metodi e poi restituiscono null, ecc. .). Stai molto meglio usando solo un’istruzione if in questo caso.

EDIT Inoltre, c’è un problema ancora più grande. Anche se stai restituendo valori, Java non considera a ? b : c a ? b : c una dichiarazione in qualsiasi senso.

L’operatore ternario è semplicemente zucchero sintattico .
Rende il codice più facile da leggere / scrivere, ma non aggiunge funzionalità reali.
Il suo uso principale era quello di comprimere diverse linee di codice in una singola riga, ed era molto utile quando si costruiscono stringhe che differiscono solo leggermente, in base ad alcune condizioni.

per esempio.

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

invece di

 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); 

Come puoi vedere, semplifica il codice.
(nota: nel secondo esempio è preferibile utilizzare StringBuilder anziché concatenazione stringa)

Ma da (condition) ? doThis() : doThat(); (condition) ? doThis() : doThat(); (senza valori di ritorno) ha lo stesso significato di if(condition) doThis(); else doThat(); if(condition) doThis(); else doThat(); ci sarebbero due modi di scrivere la stessa cosa, senza aggiungere funzionalità. Sarebbe solo complicare le cose:

  • per i programmatori: il codice non è uniforms
  • per l’implementazione dell’operatore ternario: ora deve supportare anche i metodi void

Quindi No , l’operazione ternaria non può essere utilizzata per le chiamate al metodo condizionale. Usa if-else invece:

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

L’operatore ternario (condizionale) restituisce un valore. Se i metodi non lo fanno, non possono essere utilizzati come parti dell’operatore (dove prende il valore).

Per capirlo meglio, pensiamo ad un semplice operatore binario: + . Funziona in questo modo:

  +  -->  

Ha bisogno di 2 parti valutabili e ne restituisce un’altra. Se hai digitato

 doThis() + doThat(); 

o anche

 gimmeAValue = doThis() + doThat(); 

fallirebbe, poiché né doThis()doThat() valutano nulla (essi “ritornano” void ). Ovviamente, sia che devono essere di tipo “compatibile” in modo che l’operatore + possa gestirli e restituire un valore di qualche tipo.

Ora vediamo l’operatore ternario:

  ?  :  -->  

Richiede 3 parti valutabili e restituisce un valore.

La prima parte valutabile deve essere comprensibile (castable) dal compilatore come booleano. Sarà usato per decidere quale delle altre 2 parti valutabili deve essere restituita.

Le altre due parti valutabili devono essere, beh … valutabili. A qualcosa. Di certo tipo.

In altre parole: l’operatore condizionale ternario ha lo scopo di restituire qualcosa, non come ramificazione del codice. Usato in questo modo:

 gimmeAValue = testMe() ? returnThis() : returnThat();