/* * 練習問題4.3 p.114 * 前の練習問題のLinkedListクラスは、インタフェースであるべきですか。 * どうあるべきかを決める前に、実装クラスとインタフェースクラスを使用して書き直しなさい。 */ package ch04.ex04_03; public class LinkedListImpl implements Cloneable, LinkedList { private Object object; private LinkedListImpl nextObject; public LinkedListImpl clone() { try { // デフォルトの仕組みで十分 return (LinkedListImpl) super.clone(); } catch (CloneNotSupportedException e) { // 起こり得ない。このクラスとObjectは複製できる throw new InternalError(e.toString()); } } public int getObjectNumber() { int objectNumber = 0; LinkedListImpl next = nextObject; while (true) { objectNumber++; if (next == null) { break; } else { next = (LinkedListImpl) nextObject.getNextObject(); } } return objectNumber; } public Object getObject() { return object; } public void setObject(Object target) { object = target; } public LinkedList getNextObject() { return nextObject; } public void setNextObject(LinkedListImpl target) { nextObject = target; } LinkedListImpl(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) { // リストが参照しているオブジェクトに対する変更は、他方のリストから見える Vehicle temporary = new Vehicle("test1"); LinkedListImpl link1 = new LinkedListImpl(temporary); temporary = new Vehicle("test2"); link1.setNextObject(new LinkedListImpl(temporary)); LinkedListImpl link2 = new LinkedListImpl(null); link2 = link1.clone(); System.out.println(((Vehicle) link1.getObject()).getOwner()); System.out.println(((Vehicle) link2.getObject()).getOwner()); // link1からもlink2からも変更が見える ((Vehicle) (link2).getObject()).setOwner("modified"); System.out.println(""); System.out.println(((Vehicle) link1.getObject()).getOwner()); System.out.println(((Vehicle) link2.getObject()).getOwner()); // 1つのリストに対する変更は、他方のリストに影響しない(link2のリストを別の参照にする) temporary = new Vehicle("test3"); link2 = new LinkedListImpl(temporary); temporary = new Vehicle("test4"); link2.setNextObject(new LinkedListImpl(temporary)); System.out.println(""); System.out.println(((Vehicle) link1.getObject()).getOwner()); System.out.println(((Vehicle) link2.getObject()).getOwner()); } }