/*
* 練習問題4.4 p.114
* インタフェースのみ使用して、コレクションクラス階層を設計しなさい。
*/
package ch04.ex04_04;
public class VehicleLinkedListImpl implements Cloneable, VehicleLinkedList
{
private Vehicle vehicle;
private VehicleLinkedListImpl nextVehicle;
public VehicleLinkedListImpl clone()
{
try
{
// デフォルトの仕組みで十分
return (VehicleLinkedListImpl) super.clone();
}
catch (CloneNotSupportedException e)
{
// 起こり得ない。このクラスとObjectは複製できる
throw new InternalError(e.toString());
}
}
public int getVehicleNumber()
{
int vehicleNumber = 0;
VehicleLinkedListImpl next = nextVehicle;
while (true)
{
vehicleNumber++;
if (next == null)
{
break;
}
else
{
next = (VehicleLinkedListImpl) nextVehicle.getNextVehicle();
}
}
return vehicleNumber;
}
public Vehicle getVehicle()
{
return vehicle;
}
public void setVehicle(Vehicle target)
{
vehicle = target;
}
public VehicleLinkedList getNextVehicle()
{
return nextVehicle;
}
public void setNextVehicle(VehicleLinkedListImpl target)
{
nextVehicle = target;
}
VehicleLinkedListImpl(Vehicle associatedVehicle)
{
vehicle = associatedVehicle;
nextVehicle = 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");
VehicleLinkedListImpl link1 = new VehicleLinkedListImpl(temporary);
temporary = new Vehicle("test2");
link1.setNextVehicle(new VehicleLinkedListImpl(temporary));
VehicleLinkedListImpl link2 = new VehicleLinkedListImpl(null);
link2 = link1.clone();
System.out.println(((Vehicle) link1.getVehicle()).getOwner());
System.out.println(((Vehicle) link2.getVehicle()).getOwner());
// link1からもlink2からも変更が見える
((Vehicle) (link2).getVehicle()).setOwner("modified");
System.out.println("");
System.out.println(((Vehicle) link1.getVehicle()).getOwner());
System.out.println(((Vehicle) link2.getVehicle()).getOwner());
// 1つのリストに対する変更は、他方のリストに影響しない(link2のリストを別の参照にする)
temporary = new Vehicle("test3");
link2 = new VehicleLinkedListImpl(temporary);
temporary = new Vehicle("test4");
link2.setNextVehicle(new VehicleLinkedListImpl(temporary));
System.out.println("");
System.out.println(((Vehicle) link1.getVehicle()).getOwner());
System.out.println(((Vehicle) link2.getVehicle()).getOwner());
}
}