封装集合

2004年8月3日

如果你学习面向对象设计,你会很快了解到封装数据的重要性。封装最简单的形式是使用访问器(获取和设置方法)或属性 - 如果你的语言支持的话。(有些甚至在类中这样做 - 自封装

虽然 get 和 set 约定适用于单个值,但它不适用于多值字段 - 存储多个值的字段。在这种情况下,你需要不同的访问器方案。关键是,你不想让客户端直接访问集合数据结构本身 - 因为如果你这样做,就会允许客户端在没有供应商干预的情况下更改供应商的数据。封装的全部意义在于对象控制对其数据的访问。

要修改集合字段,你通常会看到一些特定的方法来向集合添加元素,或从集合中删除元素。因此,如果我们有一个包含员工集合的 Company 类 - 我们可能会期望有 addEmployeeremoveEmployee 方法。偶尔你可能会看到一个 setEmployees 方法,它接受一个集合,但通常使用添加和删除方法更容易。

通常最棘手的部分是在获取方面。你不想返回用于存储对象的实际集合 - 否则人们可以在不使用封装的添加和删除方法的情况下添加和删除项目。那么你返回什么呢?最好的选择是对底层集合的只读视图。Java 的集合库使用它们不可修改的集合包装器使这变得容易。另一个选择,如果可用,是不能更新底层集合的迭代器。

如果这两个都不可用,通常的响应是返回底层集合的副本。这样,如果客户端修改它,它就不会对真实集合产生任何影响。复制集合会有一点时间开销,但由于这只是一堆对象引用,因此几乎从不重要。