Dynamische Objektnamen / clonen

SaschaB

Grünschnabel
Hallo zusammen,

bin noch relativ neu in der Java Programmierung:
ich kämpfe gerade mit folgendem Problem. Habe ein Spielfeld, das durch ein zweidimensionales Array dargestellt werden soll. Dort werden dann je nach Leveldatei Spielsteine (hier StartToken) eingefügt. Alle möglichen Token habe ich in einer HashMap gespeichert. Hier ein Auszug davon:

Code:
	tokenMap = new HashMap<String, Token>();
	tokenMap.put("a", new StartToken(0,getEmptyTube("a"), "a"));
	tokenMap.put("b", new StartToken(1,getEmptyTube("b"), "b"));
	tokenMap.put("c", new StartToken(2,getEmptyTube("c"), "c"));
	tokenMap.put("d", new StartToken(3,getEmptyTube("d"), "d"));
	tokenMap.put("k", new EndToken(0,getEmptyTube("k"), "k"));
	tokenMap.put("l", new EndToken(1,getEmptyTube("l"), "l"));
	tokenMap.put("m", new EndToken(2,getEmptyTube("m"), "m"));
	tokenMap.put("n", new EndToken(3,getEmptyTube("n"), "n"));

Beim erstellen lese ich dann den zu "a" gehörenden Wert aus der Hashmap und schreibe ihn an die entsprechende Arrayposition. Mein Problem ist jetzt nur, sobald ich den Wert von "a" zweimal eingefügt habe, handelt es sich jeweils um das selbe Objekt, sodass ich bei einer Änderung immer beide Objekte ändere. Ich hatte jetzt einmal nach dynamischen Objektnamen gesucht, oder auch clonen, aber nichts passendes gefunden, hoffe es weiß jemand RAT!

Viele Grüße
 
Java:
StartToken a = tokenMap.get("a");
StartToken b = tokenMap.get("a");

a und b sind immer Referenzen auf das gleiche Object.

Du könntest soetwas machen:
Java:
StartToken a = tokenMap.get("a");
StartToken b = new StartToken(a.getErsterParamter(), a.getZweiterParameter(), a.getDritterParameter());
spielfeld.put(b);

oder aber was deutlich eleganter wäre

Java:
StartToken a = tokenMap.get("a");
StartToken b = a.clone();
spielfeld.put(b);
//alternativ gleich
spielfeld.put( a.clone());

Dazu müsstest du in der Klasse StartToken Cloneable implementieren

Java:
public class StartToken implements Cloneable{
    private int ersterParam;
    private String zweiterParam;
    private String dritterParam;
	
	public StartToken(int ersterParam, String zweiterParam, String dritterParam){
		this.ersterParam = ersterParam;
		this.zweiterParam = zweiterParam;
		this.dritterParam = dritterParam;
	}
	@Override
	public StartToken clone(){
		return new StartToken(ersterParam,zweiterParam,dritterParam);
		
	}
}
 
Danke dir! Werde mich wohl mal mit dem Thema clonen beschäftigen, das scheint mir am sinnvollsten.

Habe jetzt Clone in der Oberklasse Token implementiert, das funktioniert auch habe ich festgestellt, da die Unterklasse keine weiteren Attribute haben, sollten ja auch keine Informationen verloren gehen.
 
Zurück