Метод getNode()
в классе DS возвращает ссылку на узел, сохраненный в nodeList
. Таким образом, если ваш класс Node
может быть видоизменен (с помощью методов установки или прямого доступа к его полям), то да, ваш код в test1
изменит базовую (и теперь совместно используемую) ссылку на узел.
Если вы хотите «отключить» возвращенный узел от узла в вашем хранилище данных, тогда вы можете клонировать сначала. Класс вашего узла должен будет реализовать Cloneable
и переопределить метод clone()
. Если у вас есть только примитивы в Node, то вы можете просто сделать:
public Object clone()
{
return super.clone();
}
Если у вас есть другие объекты в Node, то операция клонирования по умолчанию сделает только поверхностную копию , и вам нужно будет сделать ваш метод клонирования более расширенным, чтобы он делал глубокие копии . Из Javadoc для Object.clone ():
По соглашению, объект, возвращаемый этим методом, должен быть независимым от этого объекта (который клонируется). Для достижения этой независимости может потребоваться изменить одно или несколько полей объекта, возвращаемого super.clone, перед его возвратом. Как правило, это означает копирование любых изменяемых объектов, которые составляют внутреннюю «глубокую структуру» клонируемого объекта, и замену ссылок на эти объекты ссылками на копии. Если класс содержит только примитивные поля или ссылки на неизменяемые объекты, то обычно бывает так, что нет необходимости изменять поля в объекте, возвращенном super.clone.
Изменение в вашем классе DS будет:
public Node getNode(int index){
return (Node) nodeList.get(index).clone();
}