Rozdział 4 - Instrukcje warunkowe - Short-circuit evaluation

Pisząc złożone instrukcje warunkowe, często jesteśmy w stanie odpowiedzieć na pytanie, czy całe wyrażenie ma szansę być prawdą bądź nie jeszcze zanim obliczymy każde z wyrażeń, które na ten warunek się składa – spójrzmy na poniższy fragment kodu:

if (a <= 0 || b <= 0) {
  System.out.println("Nieprawidlowe dane.");
} else {
  System.out.println("Pole wynosi " + a * b);
}

W powyższej instrukcji warunkowej sprawdzamy poprawność wartości boków prostokąta, przechowywanych w zmiennych a oraz b. Zauważmy, że wystarczy, że pierwsze wyrażenie, a <= 0, będzie prawdą, aby całe wyrażenie:

a <= 0 || b <= 0

miało wartość true. W takim przypadku, obliczanie wartości wyrażenia b <= 0 nie ma sensu, bo i tak wiemy już, że niezależnie od wartości wyrażenia b <= 0, całe wyrażenie, a <= 0 || b <= 0 będzie miało wartość true (ponieważ operatorowi || wystarczy jeden argument o wartości true, aby całe wyrażenie miało wartość true).

Wartość wyrażenia b <= 0 musiałaby być wyznaczona tylko w przypadku, gdy wartość wyrażenia a <= 0 miałaby wartość false – ponieważ jest jeszcze szansa, że całe wyrażenie a <= || b <= 0 będzie miało wartość true, jeżeli b <= 0 będzie miało wartość true.

Podobnie sprawa ma się z operatorem && – zapiszmy powyższy fragment kodu z użyciem tego operatora:

if (a > 0 && b > 0) {
  System.out.println("Pole wynosi " + a * b);
} else {
  System.out.println("Nieprawidlowe dane.");
}

Jeżeli okaże się, że wartość a > 0 to false, to nie ma sensu sprawdzać wartości wyrażenia b > 0 – całe wyrażenie a > 0 && b > 0 nie ma szansy mieć wartości true, jeżeli chociaż jeden z jego członów ma wartość false (operator && zwróci true tylko, gdy oba operatory będą miały wartość true).

Jeżeli wartością a > 0 byłoby true, to musimy jeszcze sprawdzić drugą wartość: b > 0 – ponieważ, po obliczeniu pierwszego wyrażenia a > 0 nadal nie jesteśmy pewni, czy całe wyrażenie a > 0 && b > 0 będzie miało wartość true czy false – aby odpowiedzieć na to pytanie, potrzebujemy wartości wyrażenia b > 0.

Wyobraźmy sobie teraz, że mamy złożoną instrukcję warunkową, składającą się z wielu wyrażeń, których obliczenie jest kosztowane z punktu widzenia działania komputera, bądź kolejne warunki w wyrażeniu są zależne od poprzednich.

Dzięki funkcjonalności zwanej short-circuit evaluation, nasz program nie będzie zawsze sprawdzał wszystkich warunków, jeżeli jest w stanie wcześniej jednoznacznie wyznaczyć końcową wartość danego wyrażenia. Nie musimy nic robić, aby z tej funkcjonalności korzystać – jest ona po prostu automatycznie stosowana przez Maszynę Wirtualną Java, która wykonuje kod naszego programu.

Na razie short-circuit evaluation nie będzie miało dla nas dużego znaczenia, ale zobaczymy, że jest to istotna funkcjonalność, gdy zaczniemy korzystać z metod oraz klas.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Nie musisz podawać swojego imienia, e-mailu, ani strony www, aby opublikować komentarz. Komentarze muszą zostać zatwierdzone, aby były widoczne na stronie.