2013-04-12 10 views
20

Esiste un modo per eseguire un'operazione ternaria java senza eseguire un compito o un modo per simulare l'asserzione?Ternario Java senza assegnazione

Mi piace come appare un codice ternario succinto quando si esegue un gruppo di if/then/elses.

Spero di essere in grado di chiamare una delle due funzioni void basate su un'istruzione algebra booleana.

Qualcosa di simile:

(bool1 && bool2) ? voidFunc1() : voidFunc2();

mie funzioni sono di tipo di ritorno void, quindi se c'è un modo per simulare questo in un incarico per farlo funzionare, allora io "m bene con quello .. . mi piacerebbe vedere come si fa però :)

+0

@VenomFangs è possibile modificare le funzioni per restituire sempre un valore costante e assegnare questo valore di ritorno a una variabile fittizia. Ma non ne vale la pena - il codice sembrerà stupido, temo. Meglio farlo come sai già che dovresti fare. –

risposta

17

No, non puoi farlo. Il spec says so.

L'operatore condizionale ha tre espressioni di operando. ? appare tra la prima e la seconda espressione, e: appare tra la seconda e la terza espressione di .

La prima espressione deve essere di tipo booleano o booleano oppure si verifica un errore in fase di compilazione .

È un errore di compilazione per il secondo o il terzo operando espressione sia un'invocazione di un metodo vuoto.

[EDIT]

Dal momento che hai chiesto di riflessione, ecco una soluzione. Non sto raccomandando questo. Sto pubblicandolo solo perché hai chiesto.

public class MyCall 
{ 

    public void a(){System.out.println("a");} 
    public void b(){System.out.println("b");} 

    public static void main(String... args) 
    { 
     new MyCall().go(); 
    } 

    public void go() 
    { 
     Class<? extends MyCall> class1 = this.getClass(); 
     Method aMethod = class1.getMethod("b", null); 
     Method bMethod = class1.getMethod("a", null); 
     Object fake = false ? aMethod.invoke(this, null) : bMethod.invoke(this, null); 
     Object fake2 = true ? aMethod.invoke(this, null) : bMethod.invoke(this, null); 
    } 
} 

Alla fine della giornata, hai avuto modo di chiedersi se sia succint migliora la leggibilità del vostro codice (si pensi per-ogni loop). Nessuna di queste soluzioni migliora la leggibilità del codice IMHO. Se fossi in te, preferirei andare con questo.

if(condition) 
    a(); 
else 
    b(); 

realtà sto per compreso tra parentesi graffe anche quando loop contengono solo una singola linea, ma dal momento che si sta andando dopo il codice croccante, il frammento di codice dovrebbe fare.

+0

Qualsiasi commento sul commento di riflessione in: http://stackoverflow.com/questions/4830843/in-java-is-it-possible-to-cast-to-void -not-void –

+0

Esiste un modo per far sì che il vuoto si rifletta su null, quindi assegna null ad un oggetto? –

+2

Modificato la mia risposta con una soluzione riflettente. Ovviamente per gli scopi accademici :) –

8

No, non è possibile farlo in questo modo.

si può preferire questo stile, se non come renderlo più dichiarazioni.

if(bool1 && bool2) voidFunc1(); else voidFunc2(); 

Nell'operatore ternario, gli operandi devono essere espressioni non vuote; cioè devono produrre un valore reale.

+0

Mi piace questa presentazione ... accetterò questa risposta se nessun altro può mostrarmi un modo per farlo. Per esempio. Dal riflesso del vuoto a null ... ecc. –

1

Se si desidera davvero utilizzare ternany operation, quindi c'è un hack. MA questo è un codice molto cattivo, inteso solo per mostrare le abilità del linguaggio. Non consiglierei mai di mettere questo codice in produzione o anche mostrare ai tuoi amici.

int dummy = (bool1 && bool2) ? new Object(){ 
     public int hashCode() { 
      yourFunction1(); 
      // ... 
      yourFunctionN(); 
      return 0; 
     }; 
    }.hashCode() : new Object(){ 
     public int hashCode() { 
      yourAnotherFunction1(); 
      // ... 
      yourAnotherFunctionN(); 
      return 0; 
     }; 
    }.hashCode(); 
1

C'è un modo per fare un java operazione ternario senza fare un incarico o un modo di falsificare l'incarico?

OK, in modo che quando si scrive una dichiarazione come questa:

(bool1 && bool2) ? voidFunc1() : voidFunc2(); 

ci sono due problemi distinti con il codice:

  1. il 2 e 3 operandi di un'espressione condizionale non può essere chiamato a metodi void. Riferimento: JLS 15.25.

  2. Un'espressione non è un'istruzione, a meno che non sia né l'espressione di assegnazione O una chiamata di metodo OPPURE la creazione di un oggetto. Riferimento: JLS 14.8.

Infatti, il secondo di questi problemi è un errore di sintassi e mi aspetto alcun compilatori Java tradizionali di segnalare al posto del primo problema. Il primo problema avrebbe rivelato solo se stesso se hai fatto qualcosa di simile:

SomeType dummy = (bool1 && bool2) ? voidFunc1() : voidFunc2(); 

o

gobble((bool1 && bool2) ? voidFunc1() : voidFunc2()); 

dove gobble è un metodo che non fa nulla ... tranne che "consumano" il valore del suo argomento.

AFAIK, non esiste un contesto in cui l'espressione originale sia accettabile.


1 - "espressione condizionale" è il termine principale utilizzato per questo costrutto nel linguaggio Java Specification. È chiamato "operatore condizionale ternario" in Oracle Java Tutorial.

Problemi correlati