如何冻结HashMap以防止进一步的更改?

gdi*_*azc 5 java data-structures

这个问题几乎是不言自明的.我有一个数据结构(我提到了一个HashMap但也可能是一个Set或一个List),我最初填充:

Map<String, String> map = new HashMap<String, String>();

for( something ) {
  map.put( something );
}
Run Code Online (Sandbox Code Playgroud)

填充结构后,我永远不想添加或删除任何项目:

map.freeze();
Run Code Online (Sandbox Code Playgroud)

如何使用标准Java库实现这一目标?

Pet*_*ček 18

您可以使用标准JDK库做到最好Collections.unmodifiableMap().

请注意,您必须删除原始地图引用,因为仍可以正常访问和更改该引用.如果您将旧引用传递给任何其他对象,它们仍然可以更改您的地图.

最佳实践:

map = Collections.unmodifiableMap(map);
Run Code Online (Sandbox Code Playgroud)

并确保您没有分享原始map参考.

  • 不太正确.如果您担心某人可能会改变原始地图,您可以制作一份防御性副本.`map - Collections.unmodifiableMap(new HashMap <K,V>(map));`当然,这仍然留下了地图中的任何对象本身是否可变的问题. (4认同)

Dea*_*ron 7

听起来你会对番石榴做得很好ImmutableMap.这允许使用Builder模式来组装和"冻结".

  • 有时你想要的答案不是你需要的答案. (6认同)
  • 是的,但问题是:*如何使用**标准Java库实现这一目标**?* (5认同)