我们假设,我们需要创建一个必须提供并发性的地图,因此我们决定使用ConcurrentHashMap
。但是,ConcurrentHashMap
实现ConcurrentMap
,ConcurrentMap
实现Map
接口(多级继承)。由于通过接口引用对象是Java中的最佳实践,这是在这种情况下定义对象的最佳方法吗?请分享原因。
ConcurrentMap map = new ConcurrentHashMap();
或
Map map = new ConcurrentHashMap();
答案 0 :(得分:9)
如果您的代码了解并发性并需要调用并发方法(如putIfAbsent),则唯一的选择是ConcurrentMap。如果你只使用put / remove / get,最好选择Map。
答案 1 :(得分:2)
看到你确实意识到,ConcurrentMap扩展了Map接口,因此它拥有Map所具有的所有方法,并且它还有其他一些方法。现在,如果你想使用在ConcurrentMap接口中定义的一些方法而不是Map接口,那么你肯定需要这样的东西。
ConcurrentMap map = new ConcurrentHashMap();
但是假设您只想执行Map接口中存在的基本操作,所以现在这两个声明都是有效的。现在问题来了,哪个宣言最适合。让我们用一个例子看一下。
我们假设你有一个方法returnMap()
。它检查变量isSynchronizationRequired
。如果此变量为true,则返回ConcurrentHashMap,否则返回HashMap。代码就是这样的。
public Map returnMap(){
Map map;
if(isSynchroniztionRequired){
map = new ConcurrentHashMap();
}else{
map = new HashMap();
}
return map;
}
明确声明Map接口的实例并根据条件为其分配不同的对象,这里更适合。
答案 2 :(得分:0)
由于通过接口引用对象是最佳实践 Java,这是在这种情况下定义对象的最佳方法吗? 请分享原因。
ConcurrentMap map = new ConcurrentHashMap();或
Map map = new ConcurrentHashMap();
Map
的合同在Java Collections Framework中定义。此合约由扩展,并通过 Java并发包中的ConcurrentMap
接口进行优化。
因此,关于使用哪种类型的答案主要取决于哪个合同对您正在尝试的工作最重要。
如果您的代码正在执行Java Collections Framework中的合同所涵盖的工作,并且不需要扩展接口中定义的特殊工具,那么您将能够通过以下方式与更多代码进行互操作。使用Map
界面作为您的类型。
如果您的代码特别需要由ConcurrentMap
接口的精炼合约定义的功能(例如原子putIfAbsent()
方法),那么按顺序使用该类型很重要有权访问这些功能。您的代码与为Java Collections Framework编写的代码的互操作性较差,但这通常是可接受的权衡。
答案 3 :(得分:0)
ParentClass parent = new BaseClass()
当您从ParentClass扩展多个类并且基于某些条件时,通常会使用这种类型的赋值,将创建其中一个类的对象并为其指定父类的引用。