Klassen Kann eine Klasse sich selbst returnen?

  • Themenstarter Themenstarter Luza
  • Beginndatum Beginndatum
L

Luza

Gast
Nun ja, ich denke der Titel sagt schon alles.
Mir ist klar dass ich einfach ein neues Objekt erstellen könnte in dessen Konstruktor ich meine instanzvariablen schreibe und diese dann returne.
Danke im Vorraus
 
Java:
public class Klasse{
    int x;
    int y;

  public Klasse(){
    x = 5;
    y = 2;
  }

  public Klasse ichVerändereInstanzVariablen(int x, int y){
  this.x = x;
  this.y = y;
  //hier will ich jetzt das Objekt in der die Methode ausgefüht wird returnen
 }
}

Das möchte ich machen 😉
Meine Idee wäre so gewesen:

Java:
public class Klasse{
    int x;
    int y;

  public Klasse(int x, int y){
    this.x = x;
    this.y = y;
  }

  public Klasse ichVerändereInstanzVariablen(int x, int y){
  this.x = x;
  this.y = y;
  Klasse r = new Klasse(x, y);
  return r;
 }
}
 
Naja, Bequemlichkeit wie man sie auch z.B. beim StringBuilder hat. Da scheibt man ja auch einfach.
Java:
sb.append("Hallo").append(space).append("Welt");
Oder bei so manchem DI-Framework
Java:
x.bind(Interface.class).to(Implementation.class);

Es muss nicht immer sinnvoll sein, kann es aber.
 
Ist doch egal...

Ob du nun mit void einen Nutzlosen Wert zurückgibst, oder die Referenz auf das Objekt...

Es verwirrt wahrscheinlich aber einen fremde Reviewer... Ich würde es auch nicht machen, da man keinen überflüssigen Code produzieren sollte.
 
Java:
  public Klasse ichVerändereInstanzVariablen(int x, int y){
  this.x = x;
  this.y = y;
  Klasse r = new Klasse(x, y);
  return r;
 }
Das ist garantiert sinnfrei 😉

Entweder es werden die Eigenschaften des Objektes geändert und this zurückgegeben (Builderpattern), oder es wird eine neue Instanz mit den neuen Werten zurückgegeben und das aktuelle Objekt bleibt unverändert (immutable).

Beides auf einmal ist Quatsch 😉
 
Java:
  public Klasse ichVerändereInstanzVariablen(int x, int y){
  this.x = x;
  this.y = y;
  Klasse r = new Klasse(x, y);
  return r;
 }
Das ist garantiert sinnfrei 😉

Entweder es werden die Eigenschaften des Objektes geändert und this zurückgegeben (Builderpattern), oder es wird eine neue Instanz mit den neuen Werten zurückgegeben und das aktuelle Objekt bleibt unverändert (immutable).

Beides auf einmal ist Quatsch 😉

Das war doch nur ein Beispiel damit ich verstehe worum es geht...
 
Java:
  public Klasse ichVerändereInstanzVariablen(int x, int y){
  this.x = x;
  this.y = y;
  Klasse r = new Klasse(x, y);
  return r;
 }
Das ist garantiert sinnfrei 😉

Entweder es werden die Eigenschaften des Objektes geändert und this zurückgegeben (Builderpattern), oder es wird eine neue Instanz mit den neuen Werten zurückgegeben und das aktuelle Objekt bleibt unverändert (immutable).

Beides auf einmal ist Quatsch 😉
Ja, das ist mir dann auch aufgefallen^^ Ich wollte nur was denn da returnt werden soll.
Bin absoluter Java-Anfänger. Ich habe voller Freude auf Java dieses Jahr Info dazugewählt muss mir es jetzt jedoch mangels Qualität beim Infolehrer selbst beibringen... :/
 
Dann solltest du eher für die Variablen getter & Setter-Methoden basteln, mit denen du Werte innerhalb eines Objekts verändern kannst, wenn diese Variablen private sind.

Selbst wenn du diese über den Konstruktor ändern willst sollte man diese Methoden verwenden.

So ist ein klassisches Startbeispiel die Klasse Konto:

Java:
public Konto(int kontostand) {
this.konstostand = konstostand;
}

nicht unbedingt so gut wie

Java:
public Konto(int kontostand) {
this.konstostand = setKontoStand(konstostand);
}

private int Kontostand(int kontostand){
if(kontostand < 0) { //gib laut
}
...
 
Dann solltest du eher für die Variablen getter & Setter-Methoden basteln, mit denen du Werte innerhalb eines Objekts verändern kannst, wenn diese Variablen private sind.

Selbst wenn du diese über den Konstruktor ändern willst sollte man diese Methoden verwenden.

So ist ein klassisches Startbeispiel die Klasse Konto:

Java:
public Konto(int kontostand) {
this.konstostand = konstostand;
}

nicht unbedingt so gut wie

Java:
public Konto(int kontostand) {
this.konstostand = setKontoStand(konstostand);
}

private int Kontostand(int kontostand){
if(kontostand < 0) { //gib laut
}
...

Die Codes werden schöne Fehler Bringen. Java kennt wohl keinen "konstostand". Ich auch nicht :lol:
 
rechtschreibFlame.jpg
 
Naja, Bequemlichkeit wie man sie auch z.B. beim StringBuilder hat. Da scheibt man ja auch einfach [...]
Na gut, da hast du recht 🙂 Gibt schon Anwendungsgebiete, bei welchen es toll ist. Ist zwar kein Java, aber JQuery z.B. 😉 Alles (?) was [c]void[/c] zurückgeben würde, gibt sich selbst zurück.

Edit:
Luza, um zum Thema zurückzukommen. Wie bereits gesagt ist [c]this[/c] die Referenz auf das aktuelle Objekt. Aber meist gibt es das Case, dass eine Klasse in Methoden seinen Typen zurückgibt, aber nicht sich selbst. Das findet man bei immutablen Objekten, wie auch beim String ([c]String y = z.substring(...)[/c]). Wenn du eine unveränderliche Klasse Point hättest:
Java:
public class Point {
    // final, kann nur bei der Initialisierung gesetzt werden
    private final int x;
    private final int y;
    
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public Point withX(int x) {
        // x vom Parameter, y vom Objekt
        return new Point(x, y);
    }
    
    public Point withY(int y) {
        return new Point(x, y);
    }
}
Wenn ich nun einen Punkt p hab, und auf der X-Achse auf die 5 verschieben will, kann ich folgendes machen:
Java:
Point newPoint = p.withX(5);
Natürlich kann man da auch [c]public Point plusX(int add)[/c] oder alles andere beliebige implementieren.
 
Zuletzt bearbeitet:
Der Zurechtgewiesene kann eine Belehrung schwerlich von einer Beleidigung unterscheiden. Der dumme bleibt Hans dabei. Was hat diese Schikanierung eigentlich hier zu suchen?
 
Ich versteh sowieos nicht ganz, warum die Konvention bei Setter nicht vorsieht, das Objekt selber zurück zu geben... Ist schon praktisch

Java:
public class Kunde {

    private String name;
    private String telefon;
    private String strasse;

    public String getName() {
        return name;
    }

    public Kunde setName(String name) {
        this.name = name;
        return this;
    }

    public String getTelefon() {
        return telefon;
    }

    public Kunde setTelefon(String telefon) {
        this.telefon = telefon;
        return this;
    }

    public String getStrasse() {
        return strasse;
    }

    public Kunde setStrasse(String strasse) {
        this.strasse = strasse;
        return this;
    }

    public static void test() {
        Kunde kunde = new Kunde();
        kunde.setName("Andreas").setStrasse("Test Straße").setTelefon("061234578");
    }

}
 
Dabei aber nicht explizit für Setter sondern als genereller Ansatz, dass alle void Methoden die eigene Instanz zurückliefern. Damit wäre quasi der Datentyp von void "verändert" worden.
 
Tja das wäre z.B. eine der zu klärenden Fragen gewesen. Wäre dann vermutlich eine "virtuelle" Instanz der Klasse gewesen, welche auch nur die statisch erreichbaren Methoden anzeigt, keine Ahnung.
 

Zurück
Oben