是否可以从地图外部更改值

  • 本文关键字:外部 地图 是否 java oop
  • 更新时间 :
  • 英文 :


所以我这里有一个代码片段。我在与朋友讨论一些代码时遇到了这个问题

Map<Integer , List<String>> myMap = new HashMap<Integer , List<String>>();
List<String> list =  new ArrayList<String>();
myMap.put(45,list);
List<String> lst = myMap.get(45);
lst.add("String1");
lst.add("String2");
lst.add("String3");
System.out.println(myMap.get(45));

我的问题是。-> 如果可以通过另一个引用修改地图外的列表?我是从OOP设计的角度问的。

我直言,这完全没问题

当你写的时候

List<String> lst = myMap.get(45);

它仍然引用map中的值,用于键45

一旦你得到值(referencelist(,这取决于你用它做什么。

如果可以通过另一个引用修改地图外的列表?我是从OOP设计的角度问的。

这实际上取决于您修改它的上下文。如果您打算使用许多不同的值来执行此操作,那么您很快就会发现自己的代码非常混乱,难以调试和遵循。

但是,在您的示例中,您首先从地图加载它,然后对其进行编辑。很明显,数据来自您的Map对象。只要您在注释和文档中明确说明,尤其是在其他方法之间传递此引用时,这根本不是坏做法。

关系,只要您处理任何潜在的同步;例如,如果有多个线程可能正在修改映射和/或列表。

您可能会将此与修改对象的情况混淆。 如果修改破坏了哈希表不变量,那显然是不行的;例如

  • 如果它导致密钥的哈希代码更改,或者
  • 如果它导致键与表中使用的其他键相比给出不同的结果。

我是从OOP设计的角度问的。

我想说的是,OO设计在这个问题上是中立的。 您正在使用 Java 接口(即 Map (,这不会控制这些值。 您没有违反封装,因为Map抽象未封装这些值。

从应用角度来看,这是否是声音设计取决于整体设计。 如果不了解上下文,我们就无法以一种或另一种方式做出判断。

每个引用都有一个范围,无论您希望通过多个引用还是通过单个引用访问 Map,它都是您的选择(根据您的要求(。

没关系。在代码片段的第 5-7 行将数字添加到列表中,然后在第 8 行再次从映射中获取列表后,从映射中获取的列表将包含您刚刚添加的额外数字。

这取决于您要对列表执行的操作以及您的要求。

我会说这没问题,但最好将其封装在另一个对象中。考虑如何处理空列表的问题,应该删除还是保留它们?

封装将允许您确保删除空列表,因为用户将只访问包装器,而不是直接访问列表。

顺便说一句,HashMap您必须更改地图外的列表;)

ArrayList是可变的。它是可调整大小的,并在修改后保持相同的引用。要拥有不可变列表,您应该使用以下代码。

 List<String> list = Collections.unmodifiableList(new ArrayList<String>());

如果你定义上面的列表,那么你不能修改它。

最新更新