Hallo zusammen,
ich benutze im Moment tiefe Kopien von Objekten mittels ByteArrayOutputStream -> InputStream.
Als ich da mit Kollegen drüber gesprochen habe, waren sie der Meinung, dass man tiefe Kopien eigentlich nie verwenden sollte und das dann wohl eher ein Designfehler vorliegen würde.
Da wir aber auf keine andere Lösung gekommen sind, möchte ich das Problem hier nochmal schildern. Vielleicht könnt ihr mir ja sagen, ob hier das tiefe kopieren die beste Lösung ist, oder ob man es anders machen sollte.
Hintergrundinfos:
- web basiertes Rollenspiel
- es gibt unique-monster, d. h. Monster A gibt es in verschiedenen Ausführungen, die zufällig, basieren auf Standardwerten, generiert werden
- beim Starten des Servers werden u.a. die Basiswerte (id, name, attribute, etc.) von Monstern ausgelesen und in jeweilige Objekte gepackt. Diese Objekte speichere ich in ArrayList<Monster> monsterList
-> Damit möchte ich die Performance verbessern, da nicht jedesmal auf die DB zugegriffen werden muss, wenn die Basiswerte benötigt werden
Problemsituation:
- Brauche ich jetzt ein unique-Monster, rufe ich die Methode "public Monster getUniqueMonster(Integer)" (s.u.) auf und übergebe die Id von dem Viech, wovon ich eine zufällige Variante generiert haben möchte.
- Die Methode sucht innerhalb der monsterList nach diesem Monster und berechnet die zufälligen finalen Werte
-> hier kommt aktuell das tiefe Kopieren zum Einsatz. Würde ich einfach per monsterList.get(i) das Monster holen und bearbeiten, würde ich beim 2. Aufruf der Methode die Werte des 1. zurückgegebenen Monsters verändern, da ich ja auf dem selben Speicherbereich arbeite.
Die Methode sieht aktuell so aus:
(Monster.clone() ist die selbstgeschriebene Methode zum tiefen kopieren)
Ich hoffe, dass das jetzt halbwegs verständlich war
Für mich stellen sich im Moment 2 Fragen:
1. Spricht irgendwas grundsätzlich gegen das Erstellen von tiefen Kopien mittels der ByteArrayOutputStream-Methode? Performance, Ressourcen,...?
2. Gäbe es überhaupt eine andere Mögichkeit das hier zu lösen?
Schönen Gruß
oetzi
ich benutze im Moment tiefe Kopien von Objekten mittels ByteArrayOutputStream -> InputStream.
Als ich da mit Kollegen drüber gesprochen habe, waren sie der Meinung, dass man tiefe Kopien eigentlich nie verwenden sollte und das dann wohl eher ein Designfehler vorliegen würde.
Da wir aber auf keine andere Lösung gekommen sind, möchte ich das Problem hier nochmal schildern. Vielleicht könnt ihr mir ja sagen, ob hier das tiefe kopieren die beste Lösung ist, oder ob man es anders machen sollte.
Hintergrundinfos:
- web basiertes Rollenspiel
- es gibt unique-monster, d. h. Monster A gibt es in verschiedenen Ausführungen, die zufällig, basieren auf Standardwerten, generiert werden
- beim Starten des Servers werden u.a. die Basiswerte (id, name, attribute, etc.) von Monstern ausgelesen und in jeweilige Objekte gepackt. Diese Objekte speichere ich in ArrayList<Monster> monsterList
-> Damit möchte ich die Performance verbessern, da nicht jedesmal auf die DB zugegriffen werden muss, wenn die Basiswerte benötigt werden
Problemsituation:
- Brauche ich jetzt ein unique-Monster, rufe ich die Methode "public Monster getUniqueMonster(Integer)" (s.u.) auf und übergebe die Id von dem Viech, wovon ich eine zufällige Variante generiert haben möchte.
- Die Methode sucht innerhalb der monsterList nach diesem Monster und berechnet die zufälligen finalen Werte
-> hier kommt aktuell das tiefe Kopieren zum Einsatz. Würde ich einfach per monsterList.get(i) das Monster holen und bearbeiten, würde ich beim 2. Aufruf der Methode die Werte des 1. zurückgegebenen Monsters verändern, da ich ja auf dem selben Speicherbereich arbeite.
Die Methode sieht aktuell so aus:
Java:
public Monster getUniqueMonsterById(Integer id){
Monster tmpMonster = null;
for (int i = 0; i < allMonster.size(); i++) {
if (allMonster.get(i).getPk_Monster().equals(id)){
tmpMonster = (Monster) Monster.clone(allMonster.get(i));
break;
}
}
if (tmpMonster == null){
System.out.println("ERROR | Es gibt kein Monster mit der ID: "+ id);
}
tmpMonster.calculateStandardLevel();
tmpMonster.createUniqueAttributes();
tmpMonster.calculateFinalLevel();
tmpMonster.refreshAllValues();
return tmpMonster;
}
Ich hoffe, dass das jetzt halbwegs verständlich war
Für mich stellen sich im Moment 2 Fragen:
1. Spricht irgendwas grundsätzlich gegen das Erstellen von tiefen Kopien mittels der ByteArrayOutputStream-Methode? Performance, Ressourcen,...?
2. Gäbe es überhaupt eine andere Mögichkeit das hier zu lösen?
Schönen Gruß
oetzi