为什么要使用克隆?如何实现对象克隆
数据类型
数据类型分为简单数据类型和复杂数据类型,两者存储数据的方式不同。
- 保护原始对象
场景:订单价格计算
在计算订单价格时,需要基于原始订单进行各种折扣试算,但不能影响原始订单数据
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);
// 原始订单数据保持不变,可以安全地展示给用户