java - 返回数组列表如何破坏封装?

标签 java

我正在学习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/

相关文章:

java - Apache Geode - 连接查询性能

java - 将 Intent 文件路径共享到文件管理器以打开该路径

java - 如何嵌入Tomcat 6?

java - 有没有办法在 Java 1.4 中获得与结构等效的方法?

java - 无法在为 Windows 打包的 java 应用程序中提取 jar 文件

java - 在 SecretKey 上调用 .getEncoded() 返回 null

java - 错误 无法访问 zza

java - Struts ActionServlet 中的静态构建器类线程安全吗?

java - Android 中的什么功能可以让我在玩游戏时触摸屏幕边缘并在项目屏幕上滑动?

java - 使用 pdfBox 提取 OpenTypeFont 文本的问题