Java中实现深克隆
时间: 2024-09-23 17:06:53 浏览: 41
java 深克隆与浅克隆
在Java中,实现深度克隆通常有两种方法:手动克隆和使用`Cloneable`接口以及`Serializable`接口结合`Object.clone()`方法。这里以`Cloneable`接口为例:
1. **使用序列化:**
如果你要克隆的是实现了`Cloneable`接口并且`clone()`方法返回非`null`的对象,可以直接使用`Object`的`clone()`方法。但是,这仅适用于简单的数据类型和实现了`Cloneable`接口的类。
```java
class MyClass implements Cloneable {
private int value;
// getters and setters...
public MyClass clone() throws CloneNotSupportedException {
return (MyClass) super.clone();
}
}
MyClass original = new MyClass();
MyClass cloned = original.clone();
```
2. **使用第三方库(如Apache Commons Lang等):**
对于更复杂的对象,尤其是那些没有实现`Cloneable`接口或者其`clone()`方法受限的,可以使用一些开源库提供的深克隆工具,如`org.apache.commons.lang3.builder.DeepCopyUtils`。
```java
import org.apache.commons.lang3.builder DeepCopyUtils;
MyClass original = ...;
MyClass cloned = DeepCopyUtils.deepCopy(original);
```
3. **手动克隆(递归):**
对于复杂的数据结构,如`Map`、`List`等,可以使用递归方法逐个复制对象。
```java
public static <T> T deepClone(T obj) {
try {
if (obj == null) return null;
Class<?> clazz = obj.getClass();
if (clazz.isPrimitive()) return (T) obj; // primitives are already immutable
if (clazz.isArray()) return Array.newInstance(clazz.getComponentType(), ((Object[]) obj).length);
if (clazz.isEnum()) return Enum.valueOf((Class<Enum>) clazz, obj.toString());
if (clazz.isSerializable()) return (T) (new ObjectInputStream(new ByteArrayOutputStream())
.readObject());
} catch (Exception e) {
throw new RuntimeException("Failed to deep clone object", e);
}
return obj;
}
```
阅读全文