バックグラウンド
既存のシステムは、そのクラス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
これは、インターフェースを実装するクラスのすべてのインスタンスの単一の作成ポイントです。アプリケーションを再コンパイルせずにマップの実装を変更できるようにしたいと考えています。THashMap
これにより、たとえばTroveを使用してアプリケーションを最適化できます。
問題
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
、それでも警告を回避する方法はありますか?