2013-10-01 17 views
2
public class Hi { 
    private final Map<String, String> map; 
    public Map<String, String> getMap() { 
     return map; 
    } 
} 

我有这个喜类,我想映射是不可变的。我也需要一个getter。目前,另一个类可以从getter修改地图。我想回到地图的副本来解决这个问题,但地图是一个接口,这是否意味着我必须使吸气电话:Java:如何制作一个私人字段在一个类中不可变的地图?

return new HashMap<String,String>(map); 

是否有另一种方式做到这一点不强制映射为散列表?我希望它保持与以前一样的班级。

+0

查看'Collections.unmodifiableMap()'。 –

+0

@Popcorn'unmodifiableMap'是地图上的一个非常薄的包装,而不是副本,所以如果你使用这种技术,你还需要确保没有人能够以另一种方式访问​​底层地图,因为它仍然可以被修改。例如,如果'Hi'的构造函数将地图作为参数,则应该复制它 - 如果要使地图保持相同的类,这将很难实现。 – Grundlefleck

回答

9

返回Collections.unmodifiableMap(map),它提供了一个包含Map的不可修改的视图。从the Javadocs for that method引用:

返回指定映射的不可修改视图。该方法允许 模块为用户提供对内部地图的“只读”访问权限。 在返回的地图上“查看”到指定的 地图上的查询操作,并尝试修改返回的地图(无论是直接还是通过其集合视图),都会导致UnsupportedOperationException。

相关问题