Если класс Java реализует интерфейс Serializable
, но не имеет общедоступного метода clone()
, обычно можно создать глубокую копию, подобную этой:
class CloneHelper {
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.close();
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
T copy = (T) ois.readObject();
ois.close();
return copy;
} catch (ClassNotFoundException ex) {
// Shouldn't happen
throw new Error(ex);
} catch (IOException ex) {
// Probably a bug in T's custom serialization methods
throw new RuntimeException(ex);
}
}
}
Я часто сталкиваюсь со сторонними библиотечными классами, такими как этот, и прибегаю к взломам, подобным приведенному выше. Я даже увеличил ObjectOutputStream
, чтобы сделать копию меньше. Это никогда не вызывало серьезных проблем, кроме неэффективности (медленное кодирование / декодирование и временные графы сериализации могут занимать много памяти.)
И если использовать эту технику небезопасно, класс, вероятно, не должен был быть объявлен Serializable
.
Итак, что я хотел бы знать, если ваш класс Serializable
, что может помешать вам определить открытый метод clone()
(с использованием интерфейса Cloneable
или конструктора копирования?)
Похожие: Скопировать объект на Java