Java har en egen operator, ? kombinert med :, som fungerer litt som en if-setning. Denne er hendig å bruke i en del tilfeller hvor en må velge mellom to uttrykk, basert på en betingelse.

 

Betinget utførelse av uttrykk

En har ofte behov for å utføre ett av to uttrykk, basert på en betingelse. Anta f.eks. at en implementerer en metode som skal returnere gjennomsnittet av alle partall. Hvis en ikke finner noen partall skal resultatet være -1. En mulig løsning er vist under:

int computeEvenAverage(int[] tall) {
   int count = 0, sum = 0;
   for (int num : tall) {
      // check if even
      if ((num % 2) == 0) {
         count++;
         sum += num;
      }
   }
   if (count > 0) {
      return sum / count;
   } else {
      return -1;
   }
}

Koden sjekker for partallsegenskapen og teller og summerer tallene.

 Den siste if-en tar høyde for at det ikke er noen partall i tabellen.

Den siste if-en er ikke så elegant, fordi det ikke er så tydelig at den alltid ender opp med å returnere en verdi. I dette tilfellet kan en bruke den såkalt if-operatoren til Java, slik:

return count > 0 ? sum / count : -1;

Det er som står bak return er ett uttrykk, som består av tre deluttrykk, skilt med ? og :. Her er syntaksen: <betingelse> ? <true-uttrykk> : <false-uttrykk>. Det første deluttrykket er altså betingelse, og de to andre alternative uttrykk hvor bare den ene blir utført. Hvis betingelsen er sann (true) utføres (beregnes) det andre delutrykket, hvis betingelsen er usann (false) så utføres det tredje deluttrykket. Det uttrykket som utføres blir resultatet av uttrykket som helhet. Her beregnes altså gjennomsnittet bare dersom en har minst ett partall, ellers brukes -1.

Typiske tilfeller hvor if-operatoren blir brukt er for å unngå å utløse unntak for spesielle verdier, f.eks. dele på 0 (som over). Kanskje enda vanligere er bruk av default-verdi når en referanse er null, så en unngår NullPointerException, f.eks. string != null ? string.length() : 0. Her brukes 0 som default-verdi, når string er null. Det er en smaksak om testen er for det typiske tilfellet med default-uttrykket sist, som her, eller om testen er for spesialverdien med default-uttrykket først.

Dersom deluttrykkene er forholdsvis enkle, så blir også uttrykket som helhet enkelt nok til at det blir noenlunde lesbart, men generelt skal ikke if-operatoren brukes for mye, fordi den også kan være forvirrende.

 

  • No labels