Wie baue ich sinnvoll eine Klasse, genauer die Methodenaufrufe auf?

DontKnowJava

Mitglied
Hallo,

ich habe eine Frage zum grundsätzlichen Aufbau von Klassen:
Ich habe Klassen, die etwas in mehreren Schritten abarbeiten. Ist es sinnvoller bei einer logischen Abfolge, dass die Methoden der Klasse die jeweils nächste Methode selbst aufrufen oder ist es nicht besser nach der Instanziierung die Methoden außerhalb aufzurufen.

Meines Erachtens ist das lesbarer und damit auch sicherer. Mein Kommilitone meint wenn die Schritte sowieso nacheinander ablaufen dann soll das wegen Kapselung der Daten (???) im objektorientierten Sinn auf als Aufruf in den Methoden der Klasse selbst erfolgen (also quasi von Methode zu Methode).


Also so außerhalb der Klasse werden alle Methoden nacheinander, separat aufgerufen:

Java:
class lassWasMachen {
    public static void main(String[] args) {
        
    dieKlasseDieWasTut mach = new dieKlasseDieWasTut();
    
    mach.schrittEins();
    mach.schrittZwei();

    }
}


class dieKlasseDieWasTut{

public dieKlasseDieWasTut(){
   //mache etwas
}

public void schrittEins(){
   //mache etwas
}

public void schrittZwei(){
   //mache etwas
}


}


Oder so: Es gibt außerhalb nur den Aufruf des Konstruktors durch die Instanziierung und der Rest erfolgt (quasi unsichtbar von außen) innerhalb der Klasse von Methode zu Methode.

Java:
class lassWasMachen {
    public static void main(String[] args) {
        
    dieKlasseDieWasTut mach = new dieKlasseDieWasTut();

    }
}


class dieKlasseDieWasTut{

public dieKlasseDieWasTut(){
       
    this.schrittEins();
}

public void schrittEins(){
    
    //mache etwas
    this.schrittZwei();
}

public void schrittZwei(){
   //mache etwas
}


}

???
Ich denke das ist doch wenig sinnvoll?

Vielen Dank im Voraus 🙂 Ich weiß natürlich, dass es keinen ausschließlichen Weg gibt, aber was ist grundsätzlich vorzuziehen?
 
Erstmal solltest du dich grundsätzlich beim Deklarieren an die Koventionen halten. Klassennamen beginnen zum Beispiel mit einem Großbuchstaben.
Ansonsten halt die erste Variante für die bessere. Zumal du unterschiedliche Ergebnisse haben wirst, da
du beim zweiten Code zwangsweise eine Verkettung der Methoden erzeugt hast.
 
Ich würde es noch anders machen:

Java:
class Main{
  public static void main(String... args){
   new DoSomething().perform();
 }
}

class DoSomething{
  
  public DoSomething(Object... args){
    ...
  }

  public void perform(){
    step1();
    step2();
  }

  private void step1(){...}
  private void step2(){...}
}

Damit musst du immer nur die Methode "perform" aufrufen. Dies handelt dann intern die einzelnen Schritte ab. in den stepX-Methoden kannst du die Schritte schön einzelnd handhaben. Von außen ist nur perform() aufrufbar, da step1 und step2 private sind.

Vorteile: Wenn du mal am Ablauf etwas ändern willst (es kommt ein step3 dazu), gibt es genau eine Stelle, wo du dies ändern musst. Wenn du es immer von außen aufrufst, müsstest du jeden Aufruf anpassen, was sehr unschön wäre.

Das perform() würde ich aber trotzdem von außen aufrufen lassen. Somit kann zwischen Initialisierung und Nutzung der Klasse unterschieden werden. Prinzipiell sollte im Konstuktor nur Code stehen, der auch zur Erzeugung des Objektes nötig ist. Was man mit dem Objekt dann macht, ist Sache des Aufrufers. (Auch, wenn es nur eine Methode hat. Vielleicht kommt morgen eine zweite Methode perform2() hinzu. Willst du dann einen neuen Konstruktor schreiben? Oder noch schlimmer: Einen Steuerparameter an den Konstruktor übergeben!?)
 
Zuletzt bearbeitet:
...Prinzipiell sollte im Konstuktor nur Code stehen, der auch zur Erzeugung des Objektes nötig ist. Was man mit dem Objekt dann macht, ist Sache des Aufrufers. (Auch, wenn es nur eine Methode hat. Vielleicht kommt morgen eine zweite Methode perform2() hinzu. Willst du dann einen neuen Konstruktor schreiben? Oder noch schlimmer: Einen Steuerparameter an den Konstruktor übergeben!?)

Den Hinweis im Konstruktor nur Code zur Erzeugung des Objekts zu hinterlegen ist mir in der Form neu, macht aber sehr viel Sinn! :applaus:

Danke!!!
 

Zurück
Oben