Methoden Methode ohne Parameter auf Instanz eines Objekts aufrufen?

Willibergi

Mitglied
Hallo,
ich möchte eine Methode, die keine Parameter besitzt und auch nichts zurückliefert auf einer Instanz aufrufen. Die Methode soll Objektvariablen der Instanz, auf der sie aufgerufen wurde, ändern.
Als Beispiel habe ich die Klasse Bruch. Sie besitzt die Objektvariablen zaehler und nenner.
Die Methode kuerzen() soll nun auf einem Bruch angewendet werden und zaehler und nenner ändern.
Das sieht bei mir bis jetzt so aus:
Java:
public class Bruch{

    int zaehler, nenner;

   //Konstruktoren, etc.

   public void kuerzen(){
        int ggT = ggT(this.zaehler, this.nenner);

        this.zaehler /= ggT;
        this.nenner /= ggT;
   }

}

In einer anderen Methode der Bruch-Klasse steht:

Java:
    public Bruch addieren(Bruch b){

        return new Bruch(this.zaehler*b.nenner+b.zaehler*this.nenner, this.nenner*b.nenner).kuerzen();

    }

Ich will hier also eigentlich nur einen neuen Bruch erstellen, der gekürzt und dann zurückgegeben wird.

Meine IDE meldet aber Incompatible Types.
Wende ich diese Methode kuerzen() in der main-Klasse auf einem initialisierten Bruch-Objekt an, funktioniert sie einwandfrei.

Warum funktioniert sie in der Klasse Bruch nicht?
 
Die kuerzen() Methode wird auch in diesem Code einwandfrei angewendet. Sie gibt aber nichts zurück; man kann nicht void returnen, vor allem dann nicht, wenn man einen Bruch returnen soll.
Das return Keyword betrachtet alles, was darauf folgt, als das, was zurückgegeben werden soll. Wenn du also new Bruch(...).kuerzen() schreibst, dann wird Java versuchen das auszuführen und das Ergebnis (in diesem Fall void, weil kuerzen() void zurückgibt), zurückzugeben. Aber void ist nicht Bruch, daher der Fehler.

Es gibt zwei Möglichkeiten, das Problem zu lösen:

Java:
public Bruch addieren(Bruch b) {
    Bruch result = new Bruch(...);
    result.kuerzen();
    return result;
}

Oder aber (wird auch oft gemacht):
Java:
public Bruch kuerzen() {
    // ... code fürs kürzen
    return this;
}

EDIT:
Du solltest dir aber überlegen, ob du Objekte vom Typ Bruch nicht immutable machen willst. Sämtliche Zahlen-Typen in Java sind immutable und da ein Bruch nur eine andere Darstellung einer Zahl ist, sollte er es auch sein. In diesem Fall wäre kürzen() dann z.B. dashier:

Java:
public Bruch kuerzen(){
   int ggT = ggT(this.zaehler, this.nenner);

   int neuerZaehler = this.zaehler / ggT;
   int neuerNenner = this.nenner / ggT;

   return new Bruch(neuerZaehler, neuerNenner);
}
 
Weil das "return" den Rückgabewert der Methode "kuerzen" zurückgeben will.
Da aber "kuerzen" keinen Rückgabetyp hat passt das eben nicht zusammen.

Lösung: erstelle eine lokale Variable für dein Bruch Objekt, rufe von diesem dann die "kuerzen" Methode auf und dann gib erst den Bruch zurück.
 
Noch was: Wenn ich die Bruch-Klasse immutable machen will, muss ich doch nur die Instanzvariablen final machen, oder?
Das ist auf jeden Fall notwendig, reicht aber nicht aus. Wenn die Instanzvariablen final sind, kannst du sie natürlich auch nicht mehr ändern. Ergo musst du allen Code, der diese Variablen verändert, so ändern, dass stattdessen ein neues Objekt erstellt wird.
 
Dann kann man nicht von dieser Klasse ableiten und irgendwelche Methoden überschreiben.
Was hat das mit der immutability zu tun? Wenn die relevanten Instanzvariablen final sind, sollte das eigentlich kein Problem sein. Es macht IMO wenn dann Sinn, nur die Methoden final zu machen. Warum sollte man das ableiten verbieten? Wer ableitet und anfängt in der Kindklasse mist zu bauen... der hat so oder so pech, IMHO. Oder sehe ich da was falsch? :/
 
Wenn die relevanten Instanzvariablen final sind, sollte das eigentlich kein Problem sein.
Da hast du natürlich recht, sofern diese final sind reicht es eigentlich schon.

Es macht IMO wenn dann Sinn, nur die Methoden final zu machen.
Stimmt man könnte auch nur die Methoden final machen.
Hier ging es mir eher um Schreibarbeit 😉 ... entweder die eine Klasse als final deklarieren (sofern es auch Sinn macht) oder eben X Methoden.
 

Zurück
Oben