最近我在采访中遇到了这个问题:
编写一个函数来返回类Drawing的深度克隆实例
public class Drawing{
public List<Shape> shapes=new LinkedList<Shape>();
}
Run Code Online (Sandbox Code Playgroud)
其中shape是一个具有许多具体实现的抽象类
public abstract class Shape implements Serializable{
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我们如何解决这个问题吗?我们是否需要在所有具体实现中添加克隆方法?
您需要做的是首先序列化,然后反序列化并返回反序列化后List<Shape>的新实例DrawingList
public static Drawing deepClone(Drawing drawing) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(drawing.shapes); //Serializes the drawing.shapes
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return new Drawing((LinkedList<Shape>)ois.readObject()); //Deserializing and reading
} catch (IOException e) {
return null;
} catch (ClassNotFoundException e) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
假设您在绘图中有一个构造函数,它接受一个LinkedList<Shape>参数
编辑
当您实现接口时,您不需要clone()在重写方法时添加 Shape 类,但根据问题,他们希望您使用接口创建克隆。clone()CloneableSerializable
| 归档时间: |
|
| 查看次数: |
658 次 |
| 最近记录: |