Get Methode alles einzeln?

Mr Ma

Mitglied
Guten Abend alle zusammen.
Früher dachte ich: ach, die Programmierer. Schaut doch alles so einfach aus was die machen!
Heute befasse ich mich selber mit Java und es ist alles andere als einfach. Daher möchte ich gerne ein paar Fragen loswerden in der Hoffnung, dass mir jemand helfen kann. Es geht um die get-Methode. Hier mal der Code in zwei Dateien:
[CODE lang="java" title="Methodentraining.java" highlight="6-9"]public class Methodentraining{

private String text;
private int zahl;

public Methodentraining(String neuerText, int neueZahl){
this.text = neuerText;
this.zahl = neueZahl;
}
public String getText(){
return this.text;
}
public int getZahl(){
return this.zahl;
}
}[/CODE]

Der Main-Code, wo die Ausgabe erfolgen soll:
[CODE lang="java" title="Main"]public class MainMethodentraining{

public static void main(String[] args){
Methodentraining meth = new Methodentraining(222);
Methodentraining meth2 = new Methodentraining("zweiter text");
System.out.println(meth.getZahl());
System.out.println(meth2.getText());

}
}[/CODE]
Ich möchte mir über die get-Methode mindestens einen String und einen Zahlentyp (z.B. int) ausgeben lassen (nur get, keine set-Methode).
Bei diesem Code fliegt mir der Compiler um die Ohren.

Wenn ich den Code aber so schreibe (Main bleibt gleich):
[CODE lang="java" title="Methodentraining.java"]public class Methodentraining{

private String text;
private int zahl;

public Methodentraining(String neuerText){
this.text = neuerText;

}
public Methodentraining(int neueZahl){
this.zahl = neueZahl;
}
public String getText(){
return this.text;
}
public int getZahl(){
return this.zahl;
}
}[/CODE]

Funktioniert es. Ich bekomme: 222 und zweiter text ausgegeben.
Warum aber kann ich String und int nicht wie oben in Zeile 7 zusammenfassen?
Kann es sein, dass "this" dann überfordert ist?

Danke für Ihre Antworten.
 
Bei einem Methoden-/Konstruktoren Aufruf, müssen alle Parameter einen Wert bekommen. Wenn der Konstruktor zwei Parameter hat, dann müssen beide Parameter bei einem Aufruf ein Wert zugewiesen bekommen.

Da ist nichts überfordert oder so sondern das ist eine einfache Regel von Java.

Bei der zweiten Variante hast Du den Konstruktor überladen und es gibt zwei: Einen der einen String entgegen nimmt und der andere ein int. Da kannst Du dann aber nicht in einem Aufruf beide Werte setzen.
 
Vielen Dank für diese schnelle Antwort.
Jetzt habe ich sogar gelernt was "überladen" bedeutet, obwohl das erst mein nächstes Ziel war. Können eigentlich nur Konstruktoren und Methoden überladen werden, oder gibt es noch andere "Elemente" in Java wo dies geht?

Noch eine Frage bitte: Wenn ich ein großes Projekt habe (noch nicht😉), wo sehr viele Parameter angesprochen werden sollen, wie macht man es da? Welche besseren Möglichkeiten würden Sie wählen?
 
wo sehr viele Parameter angesprochen werden sollen, wie macht man es da?
Man kann z. B. Parameter in einer zusätzlichen Klasse zusammenfassen und diese dann als Parametertypen verwenden.
Java:
class Box {
 
    // Konstruktor mit vielen int Paramatern
    public Box(int x1, int y1, int x2, int y2) {
     
    }
 
    // oder Konstruktor mit zwei Punkten als Parameter, die jeweils x und y zusammenfassen
    public Box(Point p1, Point p2) {
     
    }
}

"Box" könnte natürlich auch wieder als Parametertyp verwendet werden.

Ansonsten gibt es auch noch das sogenannten Builder-Pattern. Kannst du ja mal irgendwann nachschlagen.

Aber: Generell sollte eine Klasse nur genau eine Aufgabe haben, sogenannte Gott-Klassen (die vieles tun und damit vielleicht auch viele Parameter haben) sind zu vermeiden.
 
Hier gibt es mehrere Möglichkeiten.

Erst einmal der generelle Aufbau:
Ein Konstruktor hat in der Regel die Parameter, die gesetzt werden müssen. Ein Auto hat immer einen Motor. Also macht es keinen Sinn, ein Auto zu erstellen, das keinen Motor hat.... So Pflicht-Elemente kommen immer in den Konstruktor.

Dinge die optional sind, kann man weglassen. Die Antirutschmatte beim Auto muss nicht da sein. Sowas läuft in der Regel über den Setter.

Das erschlägt in der Regel schon recht viel.

Wenn es aber dazu kommt, dass es sehr viele Kombinationen geben soll, die man bei der Erstellung schon angeben kann, dann gibt es ein Builder Pattern. Eine innere Builder Klasse, dessen Konstruktor keine Parameter hat, dem man alle Elemente setzen kann und dessen build() Methode dann eine neue Instanz der äußeren Klasse erstellt und zurückgibt.
 
Wenn du eine größere Menge an Attributen hast, dann packst du in den Konstruktor die notwendigen Parameter, ohne die dein Datensatz nicht funktionieren kann (z.B. eindeutige ID, falls notwendig).
Alles andere, was vielleicht "falsch" sein mag, die Funktionsweise aber nicht beeinflusst, wird dann mit gettern und settern gesetzt.
Falls es keine notwendigen Daten gibt, spricht auch nichts dagegen, im Konstruktor gar nichts und alles erst hinterher zu setzen.

Versuche auch, Container-Klassen zu verwenden, die zueinander passende Daten vereinen (wie im obigen Beispiel Point anstatt x und y)

Mach es einfach so wie im RL. Wenn du ein Auto hast, wirst du nicht alle möglichen Eigenschaften untereinander in einer Liste stehen haben, sondern gruppiert. Den im Radio eingestellten Sender in die gleiche Liste zu packen wie die Profiltiefe des linken vorderen Reifens wäre z.B. wenig sinnvoll. Du würdest eher so was haben wie auto.getReifen(LinksVorne).getProfilTiefe() und auto.getRadio().getSender().
 

Neue Themen


Zurück
Oben