119 votes

L'opérateur ternaire est-il plus rapide qu'une condition "if" en Java ?

Je suis enclin à " syndrome du "si" conditionnel "Ce qui signifie que j'ai tendance à utiliser les conditions if tout le temps. J'utilise rarement l'opérateur ternaire. Par exemple :

//I like to do this:
int a;
if (i == 0)
{
    a = 10;
}
else
{
    a = 5;
}

//When I could do this:
int a = (i == 0) ? 10:5;

Est-ce important de savoir lequel j'utilise ? Lequel est le plus rapide ? Y a-t-il des différences de performances notables ? Est-il préférable d'utiliser le code le plus court lorsque cela est possible ?

4 votes

Cela n'a pas d'importance et vous devriez plutôt vous préoccuper de la propreté du code que des performances. Dans ce cas, je pense que l'opérateur ternaire est simplement plus propre.

3 votes

Aussi, vous pouvez le faire comme ceci if(i == 0) a = 10; else a = 5;

17 votes

L'optimisation prématurée sans profilage montrant un besoin précis est mauvaise, mauvaise, mauvaise. Utilisez le code que votre futur moi comprendra le mieux dans 6 mois.

5voto

scottb Points 1766

De plus, l'opérateur ternaire permet une forme de paramètre "optionnel". Java n'autorise pas les paramètres facultatifs dans les signatures de méthodes, mais l'opérateur ternaire vous permet d'intégrer facilement un choix par défaut dans les cas suivants null est fourni pour une valeur de paramètre.

Par exemple :

public void myMethod(int par1, String optionalPar2) {

    String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2)
            .trim()
            .toUpperCase(getDefaultLocale());
}

Dans l'exemple ci-dessus, passer null comme le String vous obtenez une valeur de chaîne par défaut au lieu d'une valeur de type NullPointerException . C'est court et agréable et, je dirais, très lisible. De plus, comme cela a été souligné, au niveau du code octet, il n'y a pas vraiment de différence entre l'opérateur ternaire et l'opérateur if-then-else. Comme dans l'exemple ci-dessus, la décision de choisir l'un ou l'autre repose entièrement sur la lisibilité.

De plus, ce modèle vous permet de faire le String vraiment facultatif (s'il est jugé utile de le faire) en surchargeant la méthode comme suit :

public void myMethod(int par1) {
    return myMethod(par1, null);
}

0voto

berry120 Points 21945

Il est préférable d'utiliser celui qui se lit le mieux - en pratique, il n'y a aucune différence entre les performances.

Dans ce cas, je pense que la dernière déclaration se lit mieux que la première déclaration if, mais attention à ne pas abuser de l'opérateur ternaire - parfois, il peut vraiment rendre les choses beaucoup moins claires.

0voto

Zava Points 380

Essayez d'utiliser switch case mais normalement, ce n'est pas le goulot d'étranglement des performances.

0voto

Matthew Carlson Points 29

Pour l'exemple donné, je préfère l'opérateur ternaire ou conditionnel ( ? ) pour une raison spécifique : je vois clairement que l'affectation de a n'est pas facultatif. Avec un exemple simple, il n'est pas trop difficile d'analyser le bloc if-else pour voir que a est assigné dans chaque clause, mais imaginez plusieurs assignations dans chaque clause :

if (i == 0)
{
    a = 10;
    b = 6;
    c = 3;
}
else
{
    a = 5;
    b = 4;
    d = 1;
}

a = (i == 0) ? 10 : 5;
b = (i == 0) ? 6  : 4;
c = (i == 0) ? 3  : 9;
d = (i == 0) ? 12 : 1;

Je préfère cette dernière solution pour que vous sachiez que vous n'avez pas manqué un devoir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X