2009-02-19 6 views
12

J'attends un 'non' réponse à cette question.Pouvez-vous stocker une variable dans une if-clause?

J'étais intéressé si vous pouviez enregistrer une variable en même temps lorsque vous la cochez dans une clause if.

Disons que j'ai ce code. Je gère maintenant les états "d'échec" indépendamment, même si le résultat est le même. Je pourrais les obtenir ensemble comme ceci:

if(foo!=null && foo.getBar()!=null){ 
    Bar bar = foo.getBar(); 
    System.out.println("Success: " + bar); 
} else { 
    System.out.println("Failure."); 
} 

Beaucoup plus de code déjà. si foo est nul, il s'arrêtera là et n'essaiera pas foo.getBar (dans le if) donc je ne recevrai pas de NPE. La dernière chose que je voudrais améliorer, et la question principale: Est-ce que j'ai vraiment donné deux fois à foo.getBar()? Ce serait bien de s'éloigner du second appel identique si getBar() serait une opération très lourde. Je me demande donc s'il est en quelque sorte possible de faire quelque chose de similaire à ceci:

if(foo!=null && (Bar bar = foo.getBar())!=null){ 
    Bar bar = foo.getBar(); 
    System.out.println("Success: " + bar); 
} else { 
    System.out.println("Failure."); 
} 

je dois casser jusqu'à deux différents si est à nouveau si je voudrais faire

Bar bar = foo.getBar(); 
if (bar!=null) ... 
+0

D'ailleurs, c'est "l'échec". –

Répondre

25

C'est le plus proche, vous pouvez obtenir:

Bar bar; 
if(foo!=null && (bar = foo.getBar())!=null){ 
    System.out.println("Success: " + bar); 
} else { 
    System.out.println("Failiure."); 
} 
+0

Oui, ça a vraiment marché. J'ai essayé d'avoir (barre Bar = foo.getBar())! = Null à l'intérieur de l'if, mais java ne semble pas aimer avoir l'initialisation de l'objet à l'intérieur de la clause if. Merci! –

10

Je utilisé cette technique lorsque vous parcourez les lignes d'un BufferedReader:

BufferedReader br = // create reader 
String line 
while ((line = br.readLine()) != null) { 
    // process the line 
} 

alors oui, vous pouvez faire une mission, et le résultat ce sera la variable côté gauche, vous pouvez vérifier. Cependant, il n'est pas légal de déclarer des variables à l'intérieur d'un test, car elles ne seraient alors étendues qu'à cette expression.

7

si vous voulez limiter la portée de la barre Bar Je rajouterais {et} dans le code que Michael affiché.

 
void foo() 
{ 
    // some code ... 

    // this block limits the scope of "Bar bar" so that the rest of the method cannot see 
    // it. 
    { 
     Bar bar; 
     if(foo!=null && (bar = foo.getBar())!=null){ 
      System.out.println("Success: " + bar); 
     } else { 
      System.out.println("Failiure."); 
     } 
    } 
} 

Vous pouvez également vérifier dans le modèle d'objet null si cela a du sens. J'essaie personnellement d'éviter que les choses soient nulles si je peux ... vraiment penser à si vous voulez que l'on autorise ou non le null.

2

Depuis le département "Mon langage de programmation est meilleur que votre langage de programmation": Dans Groovy, vous pouvez utiliser le "?" opérateur:

Bar bar = foo?.bar 
if (bar != null) { 
} 

En Java, ce qui est bon motif (*):

Bar bar = foo == null ? null : foo.getBar(); 
if (bar != null) { 
} 

*: Quelque chose que vous pouvez enregistrer dans le bout des doigts.

1

Trois points qui ne fait répondre à la question:

null est le mal. N'écrivez pas les méthodes qui le renvoient. Votre exemple de problème disparaîtrait alors.

Je pense que vous pourriez manquer l'encapsulation. Au lieu de foo.getBar() peut-on faire l'interface de foo de sorte que vous exécutiez une opération "dites ne pas demander"?

Les effets secondaires dans l'expression ont tendance à provoquer un mauvais code. Préférez plus de lignes plus simples à moins de lignes buggées. L'exception habituelle si vous utilisez ++ pour incrémenter un index lors de l'accès à un tampon, ou des algorithmes similaires de style d'itérateur.

Questions connexes