zur vorherigen Seite   zum Inhaltsverzeichnis   zur nächsten Seite

Antwort:

Jede Methode, die Werte beliebigen Typs zurück gibt, kann in Boole'schen Ausdrücken verwendet werden, also sind Seiteneffekte zu beachten.

Gefahr bei jeder Methode

Zum Beispiel angenommen, dass eine Methode berechneMaximum() das Maximum einer Anzahl von Variablen berechnet, den Wert in maximum speichert und diesen Wert zurückgibt:

int summe;
int maximum; // bestimmt durch berechneMaximum()
. . .

if ( summe < 100 && berechneMaximum() < 500 ) // maximum könnte nicht berechnet worden sein
{
  . . .
}
ergebnis = 2 * maximum ;

Es gibt ein Problem hier. Die Methode, die auf && folgt, bestimmt maximum (als Seiteneffekt) nur dann, wenn summe kleiner als 100 ist. Die Zuweisungsanweisung wird manchmal den falschen Wert in ergebnis stellen. Sie sollten den Ausdruck folgendermaßen umstellen:

int summe;
int maximum;
. . .

if ( berechneMaximum() < 500 && summe < 100 )
{
  . . .
}
ergebnis = 2 * maximum ;

Mit dieser Umstellung wird der Seiteneffekt berechneMaximum() immer ausgeführt. Auch wenn diese beiden if-Anweisungen nahezu identisch aussehen, ist die erste (wohl) ein Bug. Bugs wie dieser können schwer zu finden sein.

Die beste Lösung ist die Methode berechneMaximum() so zu schreiben, dass sie keinen Seiteneffekt hat. Verwenden Sie sie daher folgendermaßen:

int summe;
int maximum;
. . .
maximum = berechneMaximum();

if ( maximum < 500 && summe < 100 )
{
  . . .
}
ergebnis = 2 * maximum ;

FRAGE 4:

Wäre es sinnvoll einen Non-Short-Circuit AND-Operator zu haben?