Ternaire Java sans affectation

Existe-t-il un moyen de faire une opération ternaire java sans faire une mission ou un moyen de simuler l'assingment?

J'aime à quel point le code ternaire est succinct quand on fait un tas de if / then / elses.

J'espère pouvoir appeler l'une des deux fonctions void basées sur une instruction d'algèbre booléenne.

Quelque Chose comme:

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

Mes fonctions sont de type de retour void, donc si il existe un moyen de faux dans une affectation pour le faire fonctionner, alors je suis d'accord avec ça... Je voudrais voir comment le faire bien :)

21
demandé sur James Oravec 2013-04-12 21:03:07

4 réponses

Non, vous ne pouvez pas faire ça. La spécification le dit .

L'opérateur conditionnel a trois expressions d'opérande. ? apparaît entre la première et la deuxième expression, et: apparaît entre deuxième et troisième expressions.

La première expression doit être de type booléen Booléen ou, ou un erreur de compilation se produit.

C'est une erreur de compilation pour le deuxième ou le troisième opérande expression pour être une invocation d'un void méthode.

[Modifier]

Puisque vous avez posé des questions sur la réflexion, voici une solution. Je ne suis pas de recommander cette. Je poste seulement parce que vous avez demandé.

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

À la fin de la journée, vous devez vous demander si être succint améliore la lisibilité de votre code (pensez à chaque boucle). Aucune de ces solutions n'améliore la lisibilité du code à mon humble avis. Si j'étais toi, je préférerais aller avec ça.

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

Je suis en fait pour y compris les accolades même lorsque les boucles ne contiennent qu'une seule ligne, mais puisque vous recherchez du code net, l'extrait ci-dessus devrait faire l'affaire.

18
répondu Deepak Bala 2013-04-12 17:32:23

Non, tu ne peux pas faire ça comme ça.

Vous pouvez préférer ce style si vous n'aimez pas le faire plus de déclarations.

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

Dans l'opérateur ternaire, les opérandes doivent être des expressions non-vides; c'est-à-dire qu'ils doivent produire une valeur réelle.

8
répondu Ajay S 2013-04-12 17:05:05

Si vous voulez vraiment-vraiment utiliser l'opération ternany, alors il y a un hack. Mais c'est un très mauvais code, destiné uniquement à montrer des capacités de langage. Je ne recommanderais jamais de mettre ce code en production ou même de le montrer à vos amis.

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
répondu Alex Stamper 2013-04-12 17:24:19

Existe-t-il un moyen de faire une opération ternaire java sans effectuer d'affectation ou de simuler l'affectation?

OK, donc quand vous écrivez une déclaration comme ceci:

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

Il y a deux problèmes distincts avec le code:

  1. Les 2ème et 3ème opérandes d'une expression conditionnelle1 ne peut pas être des appels aux méthodes void. Référence: JLS 15.25.

  2. Une expression n'est pas une instruction, sauf si elle est soit et affectation expression ou un appel de méthode ou une création d'objet. Référence: JLS 14.8 .

En fait, le deuxième de ces problèmes est une erreur syntaxe et je m'attendrais à ce que tous les compilateurs Java traditionnels le signalent au lieu du premier problème. Le premier problème ne se révélerait que si vous faisiez quelque chose comme ceci:

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

Ou

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

gobble est une méthode qui ne fait rien ... sauf "consommer" la valeur de son argument.

AFAIK, là n'est pas un contexte dans lequel l'expression originale est acceptable.


1 - "expression conditionnelle" est le terme principal utilisé pour cette construction dans la spécification du langage Java. Il est appelé "opérateur conditionnel ternaire" dans Oracle Java Tutoriel.

1
répondu Stephen C 2016-03-17 11:17:29