Rückgabewerte
Bisher haben deine Methoden etwas getan – gezeichnet oder ausgegeben. Jetzt sollen sie etwas liefern, mit dem du weiterrechnen kannst.
Wieder ein schlechtes Beispiel
Lies das Programm und beschreibe, was daran unpraktisch ist. Denk daran, was du mit den drei Ergebnissen anschließend noch machen könntest.
Auflösung
Die Methode gibt aus statt zu liefern. Damit ist das Ergebnis für das aufrufende Programm verloren:
- Du kannst die drei Summen nicht addieren.
- Du kannst nicht prüfen, ob eine davon größer als 1000 ist.
- Du kannst sie nicht in einer Datei speichern oder auf die Bühne zeichnen.
Die Methode legt außerdem gleich zwei Dinge fest: wie gerechnet wird und wie ausgegeben wird. Das sind zwei verschiedene Zuständigkeiten.
Die Lösung: return
- Statt
voidsteht jetzt der Rückgabetyp vor dem Methodennamen:int summeBis(...). - Die Anweisung
return summe;beendet die Methode sofort und liefert den Wert zurück. - Der Aufruf
summeBis(5)ist danach ein Ausdruck mit einem Wert – du kannst ihn überall verwenden, wo eine Zahl stehen darf. - Jeder Weg durch die Methode muss auf ein
returntreffen, sonst meldet die IDE einen Fehler.
Wann mit, wann ohne Rückgabewert?
Entscheide für jede Methode, ob sie besser mit oder ohne Rückgabewert gebaut wird. Begründe.
a) Den Flächeninhalt eines Kreises bestimmen
b) Eine Willkommensmeldung anzeigen
c) Prüfen, ob eine Zahl eine Primzahl ist
d) Einen Baum auf die Bühne zeichnen
e) Den größeren von zwei Werten ermitteln
Auflösung
| Rückgabewert? | Begründung | |
|---|---|---|
| a) Kreisfläche | ja, double |
ein Ergebnis, mit dem weitergerechnet wird |
| b) Willkommensmeldung | nein, void |
die Wirkung ist die Ausgabe |
| c) Primzahltest | ja, boolean |
das Ergebnis wird für eine Entscheidung gebraucht |
| d) Baum zeichnen | nein, void |
die Wirkung ist die Zeichnung |
| e) Größerer Wert | ja, int |
ein Ergebnis, das weiterverwendet wird |
Faustregel: Berechnet die Methode etwas, gib es zurück. Bewirkt sie etwas (Ausgabe, Zeichnung), reicht void.
Wer beides in einer Methode vermischt, macht sie schwerer wiederverwendbar.
Methoden, die Wahrheitswerte liefern
Zwei Dinge lohnen sich hier anzuschauen:
return pZahl % 2 == 0;– der Vergleich ist schon einboolean. Einif (…) return true; else return false;wäre umständlicher und sagt dasselbe.- In
istPrimzahlstehtreturn false;mitten in der Schleife. Sobald ein Teiler gefunden ist, steht das Ergebnis fest – die Methode bricht sofort ab. Das ist ein häufiges und gutes Muster.
Aufgabe 1: Methoden mit Tests prüfen
Ab jetzt kannst du deine Lösungen selbst prüfen. Die Online-IDE bringt einen Testrunner mit: Eine Klasse mit @Test enthält Testmethoden, die deine Methode aufrufen und das Ergebnis mit dem erwarteten vergleichen.
Ergänze die drei Methoden so, dass alle Tests grün werden.
Wechsle dazu unten in den Reiter Testrunner und klicke auf Alle Tests.
Tipp 1: maximum
Eine Verzweigung genügt. Oder – noch kürzer – du gibst direkt zurück, was größer ist.
Tipp 2: quersumme
Denk an die Zusatzaufgabe aus Kapitel 1: Die letzte Ziffer bekommst du mit % 10, und mit / 10 wirst du sie los. Wiederhole das, solange noch etwas übrig ist.
Achte auf den Testfall quersumme(0) – deine Schleife darf dann null Mal laufen.
Tipp 3: istTeilbar
Eine Zeile. Du hast das Muster gerade bei istGerade gesehen.
Aufgabe 2: Eigene Tests schreiben
Schreibe eine Methode istPalindrom(String pWort), die zurückgibt, ob ein Wort ein Palindrom ist. Den Algorithmus kennst du aus Kapitel 3 – jetzt steckt er in einer Methode mit Rückgabewert.
Ergänze außerdem die Testklasse um eigene Testfälle. Denk dabei besonders an Sonderfälle:
- das leere Wort
- ein Wort aus einem Buchstaben
- ein Wort mit gerader Buchstabenzahl
Zusatzaufgabe
Schreibe eine Methode ggt(int pA, int pB), die den größten gemeinsamen Teiler zurückgibt – nach dem euklidischen Algorithmus aus Kapitel 3.
Schreibe dazu eine Testklasse mit mindestens fünf Testfällen. Überlege dir dabei ausdrücklich, welche Sonderfälle es gibt: Was soll herauskommen, wenn eine Zahl 0 ist? Wenn beide gleich sind?