必要时进行保护性拷贝

保护性拷贝(Defensive Copy)是一种常见的编程实践,用于在传递参数或返回值时,创建副本以防止原始对象被意外修改。以下是一个例子,展示了何时进行保护性拷贝:

mport java.util.ArrayList;
import java.util.List;

public class ShoppingCart {
    private List items;

    public ShoppingCart(List items) {
        // 进行保护性拷贝
        this.items = new ArrayList<>(items);
    }

    public List getItems() {
        // 返回保护性拷贝
        return new ArrayList<>(items);
    }

    public void addItem(String item) {
        items.add(item);
    }

    public static void main(String[] args) {
        List initialItems = new ArrayList<>();
        initialItems.add("Apple");
        initialItems.add("Banana");

        ShoppingCart cart = new ShoppingCart(initialItems);

        List cartItems = cart.getItems();
        cartItems.add("Orange");  // 不会影响原始购物车对象

        System.out.println(cart.getItems());  // Output: [Apple, Banana]
    }
}

在上述示例中,ShoppingCart 类有一个构造函数和几个方法来操作购物车项。在构造函数和 getItems() 方法中,我们使用保护性拷贝来创建一个新的 ArrayList,将传入的参数或内部数据复制到新的列表中。这样做可以确保外部或调用者无法直接修改原始列表。

main() 方法中,我们创建了一个初始的购物车项列表 initialItems,并将其传递给 ShoppingCart 构造函数。然后,我们通过调用 getItems() 方法获取购物车项列表,并向其添加了一个新的元素。由于返回的是保护性拷贝的副本,所做的修改不会影响原始购物车对象。

通过对关键数据进行保护性拷贝,可以防止外部对象在未经授权的情况下修改数据,提高程序的安全性和稳定性。这尤其适用于涉及可变对象和共享数据的情况。

必要时进行保护性拷贝_第1张图片

你可能感兴趣的:(java,junit,spring,boot,java-ee,struts,tomcat,eclipse)