web-dev-qa-db-fra.com

Java: Ternary sans retour. (Pour l'appel de méthode)

Je me demandais s'il était possible de faire une opération ternaire mais sans rien retourner.

Si ce n'est pas possible en Java, est-ce possible dans d'autres langages, si oui, lesquels sont-ils applicables?

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

Non, tu ne peux pas. Mais quel est l'intérêt de ceci par rapport à une instruction if-else? Essayez-vous vraiment de sauvegarder 7 personnages?

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

ou si vous préférez le mauvais style:

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

Peu importe le fait que vous pouvez simplement faire (dans ce cas):

name.setChecked(name.isChecked());

Le but de l'opérateur ternaire ou "conditionnel" est d'introduire des conditions dans une expression . En d'autres termes, ceci:

int max = a > b ? a : b;

est censé être un raccourci pour cela:

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

Si aucune valeur n'est en cours de production, l'opérateur conditionnel n'est pas un raccourci.

45
Mark Peters

Je me demandais s'il était possible de faire une opération ternaire mais sans rien retourner.

Non ce n'est pas possible:

  1. Les 2e et 3e opérandes doivent obligatoirement être des expressions non vides; c'est-à-dire qu'ils doivent produire une valeur réelle.

    "C'est une erreur de compilation que la seconde ou la troisième expression d'opérande soit une invocation d'une méthode void." - JLS 15.25 .

  2. Une expression ternaire est une expression et ne peut pas être utilisée comme une déclaration.

    "Certains types d'expressions peuvent être utilisés comme déclarations en les suivant avec des points-virgules." ... et l'expression ternaire n'en fait pas partie - JLS 14.8 .

Si vous voulez vraiment, vraiment utiliser une expression ternaire sans utiliser la valeur de l'expression, le plus simple est d'attribuer la valeur à une variable factice et d'ajouter une annotation pour supprimer l'avertissement concernant la variable non utilisée.

Mais une meilleure idée est d’utiliser une déclaration if simple.

Si ce n'est pas possible en Java, est-ce possible dans d'autres langages, si oui, lesquels sont-ils applicables?

Je suis un peu rouillé, mais je pense que C, C++ et Perl permettent tous d'utiliser des expressions arbitraires là où leurs valeurs ne sont pas utilisées.

11
Stephen C

Parfois, vous pouvez utiliser une opération ternaire sur les arguments de méthode pour résoudre votre demande.

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

en passant, la meilleure solution pour votre problème est

name.setCecked(name:isChecked());
5
Amir Pashazadeh

En Java, le code suivant n'est pas possible:

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

par exemple, vous ne pouvez pas compiler le code suivant:

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

vous obtenez l'erreur de compilation suivante:

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

Vous devez renvoyer une valeur et cela ne fonctionnera pas si vous voulez que cela fonctionne comme une méthode void qui exécute une action sans renvoyer de valeur.

J'espère que cela t'aides...

0
Android