/* * 練習問題3.10 p.93 * (第2章の問題からの)LinkedListクラスをCloneableにして、値の複製ではなく、元のリストと同じ値を参照している * 新たなリストを返すcloneメソッドを書きなさい。つまり、1つのリストに対する変更は、他方のリストには影響しないが、 * リストが参照しているオブジェクトに対する変更は、他方のリストから見えます。 */ package ch03.ex03_10; public class LinkedList implements Cloneable { private Object object; private LinkedList nextObject; public LinkedList clone() { try { // デフォルトの仕組みで十分 return (LinkedList) super.clone(); } catch (CloneNotSupportedException e) { // 起こり得ない。このクラスとObjectは複製できる throw new InternalError(e.toString()); } } public int getObjectNumber() { int objectNumber = 0; LinkedList next = nextObject; while (true) { objectNumber++; if (next == null) { break; } else { next = nextObject.getNextObject(); } } return objectNumber; } public Object getObject() { return object; } public void setObject(Object target) { object = target; } public LinkedList getNextObject() { return nextObject; } public void setNextObject(LinkedList target) { nextObject = target; } LinkedList(Object associatedObject) { object = associatedObject; nextObject = null; } public String toString() { String desc = "This method is toString of LinkedList!"; return desc; } /** * @param args */ public static void main(String[] args) { // リストが参照しているオブジェクトに対する変更は、他方のリストから見える LinkedList link1 = new LinkedList(new Vehicle("test1")); link1.setNextObject(new LinkedList(new Vehicle("test2"))); LinkedList link2 = new LinkedList(null); link2 = link1.clone(); System.out.println(((Vehicle) link1.getObject()).getOwner()); System.out.println(((Vehicle) link2.getObject()).getOwner()); System.out.println(""); // link1からもlink2からも変更が見える ((Vehicle) (link2).getObject()).setOwner("modified"); System.out.println(((Vehicle) link1.getObject()).getOwner()); System.out.println(((Vehicle) link2.getObject()).getOwner()); // 1つのリストに対する変更は、他方のリストに影響しない(link2のリストを別の参照にする) link2 = new LinkedList(new Vehicle("test3")); link2.setNextObject(new LinkedList(new Vehicle("test4"))); System.out.println(""); System.out.println(((Vehicle) link1.getObject()).getOwner()); System.out.println(((Vehicle) link2.getObject()).getOwner()); } }