我正在学习java,我的老师告诉我这违反了封装原则:
private ArrayList<Item> inventory;
inventory = new ArrayList<Item>();
public List<Item> getInventory() {
return inventory;
}
他告诉我,我不应该直接返回库存,因为它破坏了封装,但我应该像这样返回一个副本(见下文),所以我们不想直接返回它。当我们只想更改第一个列表(通过添加项目)时,返回两个列表有什么意义?
public List<Item> getInventory() {
return new Arraylist<Item>(inventory);
}
但是,他的解释对我来说毫无意义,有人可以帮忙吗? 感谢您的宝贵时间:)
最佳答案
假设我是您图书馆的调用者,并且想在不询问您的情况下从库存中删除某些内容。我可以编写代码来获取库存项目列表,对其进行操作,但你永远不会知道。
List<Item> stolenInventory = yourObject.getInventory();
stolenInventory.remove(0);
或者,如果我想添加自己的项目而不经过正确的流程:
List<Item> theInventory = yourObject.getInventory();
theInventory.add(myIllegalProduct);
您的 inventory
副本和我的 inventory
副本是相同的,因为它们引用相同的对象。通过制作防御性副本,您可以让我了解库存
,但我无法以影响您(库存元素的权威)的方式操纵它。
关于java - 返回数组列表如何破坏封装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48346063/