【发布时间】:2012-10-04 07:45:56
【问题描述】:
我有一个关于封装的问题。据我所知,封装可以使用私有/受保护的数据成员隐藏实现细节,并提供公共方法和属性来操作数据。这里的想法是防止类消费者直接修改数据成员。
但我担心返回私有/受保护数据成员的属性 getter 或其他公共方法。例如:如果我有这样的课程
public class Inventory
{
private List<Guitar> guitars = new List<Guitar>();
public void AddGuitar(string serialnumber, string price)
{
Guitar guitar = new Guitar(serialnumber, price);
guitars.Add(guitar);
}
public List<Guitar> GetGuitars()
{
return guitars;
}
}
现在,如果 Inventory 类消费者调用 GetGuitars,他将获得在 Inventory 类中维护的吉他列表。现在消费者可以修改列表,例如删除/添加/修改项目。对我来说,看起来我们没有封装。我认为我应该在 GetGuitars() 中返回吉他列表项的副本。你怎么看?
我对封装的理解对吗?
谢谢
【问题讨论】:
-
这或多或少是在决定是否严格遵守Law of Demeter 时面临的权衡。许多人会争辩说,正如您所做的那样,允许访问组合对象是务实的。像 C++ 这样的语言将允许
GetGuitars()成为const。 -
防御性复制列表不会有太大帮助,只要吉他不是一成不变的或防御性复制的。遗憾的是,java 缺乏良好的不变性支持。
-
伙计们,他问的不是Java。它是 C#(我猜)
标签: oop encapsulation