为什么要使用克隆?如何实现对象克隆

数据类型

数据类型分为简单数据类型和复杂数据类型,两者存储数据的方式不同。

  1. 保护原始对象
    场景:订单价格计算

在计算订单价格时,需要基于原始订单进行各种折扣试算,但不能影响原始订单数据

public class Order implements Cloneable {
    private List<OrderItem> items;
    private BigDecimal totalAmount;
    private BigDecimal discount;
    
    // 深克隆实现
    @Override
    public Order clone() {
        try {
            Order cloned = (Order) super.clone();
            cloned.items = new ArrayList<>();
            for (OrderItem item : this.items) {
                cloned.items.add(item.clone());
            }
            return cloned;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

// 使用示例
Order originalOrder = orderService.getOrder(orderId);
Order trialOrder = originalOrder.clone(); // 创建用于试算的副本

// 应用各种折扣规则试算
discountService.applyCoupon(trialOrder, coupon);
discountService.applyMemberDiscount(trialOrder);
discountService.applyPromotion(trialOrder);

// 原始订单数据保持不变,可以安全地展示给用户