Java中集合的深度克隆

mah*_*n07 11 java cloning

最近我在采访中遇到了这个问题:

编写一个函数来返回类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)

任何人都可以告诉我们如何解决这个问题吗?我们是否需要在所有具体实现中添加克隆方法?

Sne*_*neh 3

您需要做的是首先序列化,然后反序列化并返回反序列化后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