Die getNode()
Methode für die DS-Klasse gibt eine Referenz an den in nodeList
gespeicherten Knoten zurück. Wenn also Ihre Klasse Node
mutiert werden kann (über Setter-Methoden oder direkten Zugriff auf ihre Felder), dann wird Ihr Code in test1
die zugrunde liegende (und jetzt freigegebene) Node-Referenz ändern.
Wenn Sie den zurückgegebenen Knoten vom Knoten in Ihrem Datenspeicher trennen möchten, können Sie zuerst clone. Ihre Knotenklasse muss Cloneable
implementieren und die clone()
-Methode überschreiben. Wenn Sie nur Primitiven in Knoten haben, dann können Sie einfach tun:
public Object clone()
{
return super.clone();
}
Wenn Sie andere Objekte in Knoten haben, dann wird nur der Standard Klonvorgang eine flache Kopie machen, und Sie machen müssen, um Ihre Klon Methode umfangreicher, so dass es tiefe Kopien macht. Aus dem Javadoc für Object.clone():
Per Konvention sollte das Objekt, das von dieser Methode zurückgegeben wird, unabhängig von diesem Objekt sein (das geklont wird).Um diese Unabhängigkeit zu erreichen, kann es notwendig sein, ein oder mehrere Felder des von super.clone zurückgegebenen Objekts zu ändern, bevor es zurückgegeben wird. In der Regel bedeutet dies, dass alle änderbaren Objekte kopiert werden, die die interne "Tiefenstruktur" des geklonten Objekts bilden, und die Referenzen auf diese Objekte durch Referenzen auf die Kopien ersetzt werden. Wenn eine Klasse nur primitive Felder oder Verweise auf unveränderbare Objekte enthält, müssen in der Regel keine Felder in dem von super.clone zurückgegebenen Objekt geändert werden.
Die Änderung wird an Ihrer DS Klasse:
public Node getNode(int index){
return (Node) nodeList.get(index).clone();
}
FYI Der Name an einen Konstruktor gegeben, das ein anderes Objekt des gleichen Typs akzeptiert und erstellt eine Kopie von ihm (wenig überraschend) eine „Kopie ist Konstruktor " – Bohemian
Reicht die vorhandene Standardklonmethode nicht aus? sollte ich das explizit implementieren? – sravanreddy001
@mrb - Wenn Sie 'clone()' für ein Objekt aufrufen, das 'Cloneable' nicht implementiert, erhalten Sie eine' CloneNotSupportedException'. Referenz: Javadocs für 'Cloneable'. –