背景
现有系统通过其Generics
类创建HashMap
实例过多时抑制警告:使用动态类引用
import java.util.Map;
import java.util.HashMap;
public class Generics {
public static <K,V> Map<K, V> newMap() {
return new HashMap<K,V>();
}
public static void main(String args[]) {
Map<String, String> map = newMap();
}
}
这是创建的用于类的所有实例的单点实现Map
接口。我们希望能够在不重新编译应用程序的情况下更改地图实现。这将允许我们使用Trove的THashMap
来优化应用程序。
问题
软件无法与特罗韦的THashMap
捆绑因许可条件。因此,如果有一种方法可以指定要在运行时实例化的地图名称(对于那些没有这种许可限制的人员),那将是非常棒的。例如:
import java.util.Map;
import java.util.HashMap;
import gnu.trove.map.hash.THashMap;
public class Generics {
private String mapClassName = "java.util.HashMap";
@SuppressWarnings("unchecked")
public <K,V> Map<K,V> newMap() {
Map<K,V> map;
try {
Class<? extends Map<K,V>> c = (Class<Map<K,V>>)Class.forName(
getMapClassName()).asSubclass(Map.class);
map = c.newInstance();
}
catch(Exception e) {
map = new HashMap<K,V>();
}
return map;
}
protected String getMapClassName() {
return this.mapClassName;
}
protected void setMapClassName(String s) {
this.mapClassName = s;
}
public static void main(String args[]) {
Generics g = new Generics();
Map<String, String> map = g.newMap();
System.out.printf("Class = %s\n", map.getClass().toString());
g.setMapClassName("gnu.trove.map.hash.THashMap");
map = g.newMap();
System.out.printf("Class = %s\n", map.getClass().toString());
}
}
问题
有没有办法避免@SupressWarnings
批注与-Xlint
编译时,仍然避免了警告?
你可能想预先计算'C'和结果存储在一个静态的(并重新计算时调用'setMapClassName') - 每次你想要一张地图时,'Class.forName'有点贵重新运行。 – 2013-03-20 19:38:05
我怀疑你问的问题的答案是“不”,但我喜欢被证明是错误的。 – 2013-03-20 19:40:05