保护性拷贝(Defensive Copy)是一种常见的编程实践,用于在传递参数或返回值时,创建副本以防止原始对象被意外修改。以下是一个例子,展示了何时进行保护性拷贝:
mport java.util.ArrayList;
import java.util.List;
public class ShoppingCart {
private List<String> items;
public ShoppingCart(List<String> items) {
// 进行保护性拷贝
this.items = new ArrayList<>(items);
}
public List<String> getItems() {
// 返回保护性拷贝
return new ArrayList<>(items);
}
public void addItem(String item) {
items.add(item);
}
public static void main(String[] args) {
List<String> initialItems = new ArrayList<>();
initialItems.add("Apple");
initialItems.add("Banana");
ShoppingCart cart = new ShoppingCart(initialItems);
List<String> cartItems = cart.getItems();
cartItems.add("Orange"); // 不会影响原始购物车对象
System.out.println(cart.getItems()); // Output: [Apple, Banana]
}
}
在上述示例中,ShoppingCart
类有一个构造函数和几个方法来操作购物车项。在构造函数和 getItems()
方法中,我们使用保护性拷贝来创建一个新的 ArrayList
,将传入的参数或内部数据复制到新的列表中。这样做可以确保外部或调用者无法直接修改原始列表。
在 main()
方法中,我们创建了一个初始的购物车项列表 initialItems
,并将其传递给 ShoppingCart
构造函数。然后,我们通过调用 getItems()
方法获取购物车项列表,并向其添加了一个新的元素。由于返回的是保护性拷贝的副本,所做的修改不会影响原始购物车对象。
通过对关键数据进行保护性拷贝,可以防止外部对象在未经授权的情况下修改数据,提高程序的安全性和稳定性。这尤其适用于涉及可变对象和共享数据的情况。