# Objekt dynamisch neu erstellen/ austauschen



## thisismyname (26. Jan 2010)

Hi,

folgendes Szenario:

Ein Objekt wird ueber einige Zeilen lang benutzt zb:


```
Hans hans = new Hans();

hans.setPassword("xxx");
hans.setUser("yyy");

hans.setX();
hans.setY();
hans.setZ();

hans.cleanup();
```

Nun moechte ich mit dem Aufruf von cleanup folgendes erledigen.
* Die Referenz auf hans soll erhalten bleiben
* Es soll aber ein neues Objekt erstellt werden in dem alles auf default ist (wie wenn ich new Hans() ausfuehre)... bis auf user+password

ein code wie

```
public void cleanup(){ 
Hans blub = new Hans();
blub.setPassword(this.getPassword());
blub.setUsername(this.getUsername());
this = blub;
}
```

wird nicht funktionieren, oder??

Das eigendliche Problem ist, das ausser Username und Passwort noch zig variablen existieren, die ich aber nicht alle benennen kann, weil diese noch anwachsen.

Ich bin auch gerne fuer andere Loesungsmoeglichkeiten offen.

greetz myname


----------



## Tharsonius (26. Jan 2010)

Du könntest einfach in das cleanup() alles reinschreiben, dass die Ursprungswerte gesetzt werden.
Immer wenn Du eine neue Variable festlegt und die entsprechende Belegung in den Konstruktor schreibst kopierst die Zeile einfach und schreibt das selbe in cleanup() ebenfalls rein.


----------



## ARadauer (26. Jan 2010)

Versuch das mal...

```
public Hans cleanup(){ 
Hans blub = new Hans();
blub.setPassword(this.getPassword());
blub.setUsername(this.getUsername());
return blub;

}
....

...


hans = hans.cleanup();
```


----------



## Michael... (26. Jan 2010)

Wenn ich das richtig verstanden habe soll ein zusätzliches Objekt erstellt werden, das teilweise Attribute des ursprünglichen Objektes übernimmt.

--> Verpass Deiner cleanup() einen Rückgabewert vom Typ Hans und gib blub zurück.

Allerdings ist mir nicht klar was Du dann mit this = blub bezweckst? Soll die Referenz die auf das ursprüngliche Objekt weisst auf das neue verweisen? Was passiert dann mit dem alten Objekt?


----------



## Tharsonius (26. Jan 2010)

Die Sache mit der Rückgabe eines neuen Objekts ist ja, dass die variable hans nur eine neue Referenz auf ein neues Objekt bekommt.
Hat man die Referenz auf das ursprüngliche Objekt aber an andere Klassen weiter gegeben, dann aktualisieren sich diese Referenzen dabei nicht. hans verweist auf das neue Objekt, das den selben Benutzernamen und das selbe Passwort verwendet, eventuelle Kopien der Referenzen hingegen verwenden weiterhin das alte Objekt.


----------



## thisismyname (26. Jan 2010)

Tharsonius hat gesagt.:


> Die Sache mit der Rückgabe eines neuen Objekts ist ja, dass die variable hans nur eine neue Referenz auf ein neues Objekt bekommt.
> Hat man die Referenz auf das ursprüngliche Objekt aber an andere Klassen weiter gegeben, dann aktualisieren sich diese Referenzen dabei nicht. hans verweist auf das neue Objekt, das den selben Benutzernamen und das selbe Passwort verwendet, eventuelle Kopien der Referenzen hingegen verwenden weiterhin das alte Objekt.



Du meinst also ernsthaft, der Code oben wuerde funktionieren???

Ich denke trotzdem das die Variante mit dem Rückgabewert die bessere ist... danke fuer den schubser 

greetz


----------



## System.exit(0) (26. Jan 2010)

Hallo,

letzten Endes möchtest du doch eigentlich nur einige Standardwerte überschreiben.

Dann gib doch einfach deiner Klasse hans neben dem Konstruktor eine Methode machneu(int x, int y ... ) mit.
Diese überschriebt dann einfach die alten Werte.


```
public class Hans
{
private int x, y;
private String Password;

public Hans(int x, int y, String Password)
{ this.x = x;
   this.y= y;
   this.Password = Password;
}

public void machneu( int x, int y)
{ this.x = x;
   this.y = y;
}
```

Später im Code kannst du dann mit 

```
Hans.machneu(0,1);
```

einfach die lästigen alten Parameter überschreiben. Die Referenz bleibt gleich.

Gruß

System.exit(0)


----------



## Tharsonius (27. Jan 2010)

thisismyname hat gesagt.:


> Du meinst also ernsthaft, der Code oben wuerde funktionieren???
> 
> Ich denke trotzdem das die Variante mit dem Rückgabewert die bessere ist... danke fuer den schubser
> 
> greetz



Der von ARadauer sollte durchaus funktionieren.

Ich sehe das aber als gefährlich an, da eben die Referenz nicht gleich bleibt sondern nur der einen Variablen ein neues Objekt zugewiesen wird. Solltest Du an anderer Stelle ebenfalls hans benutzen, dann habst Du dort noch immer die alte Referenz.

Ich würde Dir, wie in meinem ersten Post bereits geschrieben, noch immer dazu raten in Deine cleanup() einfach eine kopie des Konstruktors unterzubringen und dort halt all das rein schreiben, was Du zurückgesetzt haben möchtest.


----------



## thisismyname (27. Jan 2010)

Tharsonius hat gesagt.:


> Der von ARadauer sollte durchaus funktionieren.
> 
> Ich sehe das aber als gefährlich an, da eben die Referenz nicht gleich bleibt sondern nur der einen Variablen ein neues Objekt zugewiesen wird. Solltest Du an anderer Stelle ebenfalls hans benutzen, dann habst Du dort noch immer die alte Referenz.
> 
> Ich würde Dir, wie in meinem ersten Post bereits geschrieben, noch immer dazu raten in Deine cleanup() einfach eine kopie des Konstruktors unterzubringen und dort halt all das rein schreiben, was Du zurückgesetzt haben möchtest.



Naja, da liegt ja genau das Problem. Ich initialisiere das meiste nicht im Konstruktor, sondern beim deklarieren, also via:

```
public void int zahl = 0;
```
Ist eben nicht so 100% sauber... Aber dadurch das ich ausser User und Passwd noch ca 50 andere Variablen habe, will ich die nicht alle aufzaehlen, sondern einfach alles "neu machen" und dann die 2 Werte setzen.

greetz


----------



## Firestorm87 (27. Jan 2010)

Was man will und was man kann.....
Du kannst alternativ eine Methode implementieren, die dir alle Attribute aus einem 2ten Objekt kopiert...

Also ein neues Objekt erzeugen (hat ja dann die gewünschten Werte) und dann nach dem Motto "hans.setAtriTo(bernd)".
Das könnte man sogar per reflektion und Schleife machen ohne komplett alle 50 werte aufzuzeigen (wenn denn jedes attribut ein getter und setter hat)....


----------

