java克隆类

本文通过一个具体的Java代码示例,展示了如何实现一个包含引用类型成员变量的对象克隆,并分析了浅拷贝与深拷贝的区别。代码中定义了一个包含自定义类引用的Info类,并实现了Cloneable接口以支持克隆功能。

class guodong{
    String name;
    public guodong(String name){
        this.name = name;
    }
}

class info implements Cloneable{
    int age = 22;
    guodong Address ;

    public info(int a){
        this.age = a;
        this.Address = new guodong("guodong");
    }

    public  info clone() throws CloneNotSupportedException
    {
        //通过Object类的clone的方法来克隆出一个info的副本。
        return (info)super.clone();

    }
}


public class CloneTest {
    public static void main(String[] args) throws CloneNotSupportedException {

        info guo = new info(22);
        info guoguo = guo.clone();          //在guoguo中的到了guo的副本

//通过对比guo和guoguo 来判断是否是同一个类,得到false
        System.out.println(guo == guoguo );
//来判断guo中的Address类和guoguo中的Address类得到true
        System.out.println(guo.Address == guoguo.Address);

//结论:通过clone克隆得到的实例与原实例并不是同一个实例,在堆内存中占据不同的空间,但是在实例中的引用所指向的地址却是同一个地址。
        }
}
Java 中实现克隆涉及多个方面,包括浅克隆、深克隆以及如何根据具体需求选择合适的方法。以下是实现克隆的主要方法及最佳实践: ### 浅克隆的实现 浅克隆是指对象的字段被复制到新对象中,但嵌套对象(如引用型字段)仅复制引用,而不是创建新的对象。实现浅克隆通常需要以下步骤: 1. 实现 `Cloneable` 接口:这是一个标记接口,用于标识的对象可以被克隆。 2. 重写 `clone()` 方法:由于 `Object` 中的 `clone()` 方法是受保护的,因此需要将其重写为 `public`。 示例代码如下: ```java public class ShallowCloneExample implements Cloneable { private int value; private SomeObject nestedObject; @Override public ShallowCloneExample clone() { try { return (ShallowCloneExample) super.clone(); } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } } ``` 浅克隆适用于对象的字段不包含嵌套对象的情况,否则可能导致意外的共享状态 [^1]。 ### 深克隆的实现 深克隆是指复制对象及其所有嵌套对象,确保新对象与原对象完全独立。实现深克隆的方式有多种: 1. **递归克隆**:手动实现嵌套对象的克隆逻辑。 2. **序列化与反序列化**:通过序列化对象再反序列化来实现深克隆。 3. **第三方库**:如 Apache Commons Lang 或其他工具库提供深克隆功能。 示例代码使用递归克隆: ```java public class DeepCloneExample implements Cloneable { private int value; private NestedObject nestedObject; @Override public DeepCloneExample clone() { try { DeepCloneExample cloned = (DeepCloneExample) super.clone(); cloned.nestedObject = nestedObject.clone(); // 假设 NestedObject 也实现了 clone() return cloned; } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } } ``` 深克隆适用于对象包含嵌套结构或需要完全独立的场景 [^2]。 ### 使用 `record` 实现克隆Java 16 及更高版本中,可以使用 `record` 简化的设计。通过紧凑构造器,可以实现防御性拷贝以支持克隆: ```java public record DeepCloneRecord(byte[] data) { public DeepCloneRecord { data = Arrays.copyOf(data, data.length); } } ``` 此方法确保构造器参数的副本被存储,避免外部修改影响内部状态 。 ### 模式匹配与克隆策略 Java 17 引入了模式匹配(如 `switch` 表达式),可以用来实现灵活的克隆策略。例如,根据对象型选择不同的克隆方式: ```java public Object smartClone(Object original) { return switch (original) { case null -> null; case Integer _, String _ -> original; // 基本型直接返回 case UserRecord user -> new UserRecord(user.name(), user.birthday()); // Record 型使用构造器复制 case List<?> list -> list.stream() .map(this::smartClone) .collect(Collectors.toList()); // 集合型深度克隆 case Cloneable clonable -> clonable.clone(); // 传统克隆实现 default -> CloneUtils.deepClone(original); // 默认序列化方案 }; } ``` 通过模式匹配,可以编写更简洁且可扩展的克隆逻辑 [^2]。 ### 克隆的最佳实践 1. **谨慎覆盖 `clone()` 方法**:确保 `clone()` 方法的行为符合预期,避免不必要的副作用。 2. **实现 `toString()` 方法**:为实现有意义的 `toString()` 方法,有助于调试和日志记录 [^3]。 3. **选择合适的方法**:根据对象的结构选择浅克隆或深克隆,并考虑使用序列化或第三方库来简化实现。 4. **防御性拷贝**:对于不可变性要求高的,使用构造器或工厂方法实现防御性拷贝。 ### 示例:电话号码的 `toString()` 方法 ```java @Override public String toString() { return String.format("(%03d) %03d-%04d", areaCode, prefix, lineNumber); } ``` 此方法提供了清晰且易于解析的字符串表示,符合 `toString()` 方法的设计原则 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值