背景
现有系统通过其类创建大量HashMap
实例:Generics
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'sTHashMap
来优化应用程序。
问题
THashMap
由于许可条件,该软件不能与 Trove 捆绑在一起。因此,如果有一种方法可以指定地图的名称以在运行时实例化(对于那些没有此类许可限制的人),那就太好了。例如:
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
并且仍然避免警告?