2008-09-01 10 views
9

ジェネリック定義を定義して使用する簡略な方法はありますか?特定の一般的な記述を繰り返し続ける必要はありません。変更があれば、コードベースからすべての定義/用途を変更する必要はありませんJavaのジェネリック

グルーヴィー
Typedef myGenDef = < Object1, Object2 >; 

HashMap<myGenDef> hm = new HashMap<myGenDef>(); 

for (Entry<myGenDef> ent : hm..entrySet()) 
{ 
. 
. 
. 
} 

答えて

11

pseudo-typedef antipattern ...

があります0
class StringList extends ArrayList<String> { } 

良いもの、飲み物! ;-)

このテクニカルノートにはいくつかの重大な問題があります。主に、この「typedef」は実際には別のクラスであるため、拡張する型または他の同様に定義された型と互換的に使用することはできません。

+0

特に代替案がある場合、あなたの質問に対する解決策として反パターンを受け入れることは良い考えではないかもしれません。しかし、それがあなたの特定の問題であなたを助けたら... –

+0

(Javaの "typedef"スレッドの騒音に関するモデレータの警告を無視して)...それは反パターンより悪いです。仮想メソッドテーブルに独自のエントリを持つ新しいファーストクラスの型およびそのようなすべての義務が作成されます。C++のtypedefは単に "ArrayList "のDRY部分を作成するので、String(またはArrayList)は1つの場所でしか変更できません。 – Phlip

+0

はい、C/C++のtypedefは、優れたサポートと多くの正当な使用法を持つ、尊敬される言語機能です。これではありません。したがって、全体の "反パターン"のことです。 – Shog9

1

号ものの、JVM言語、動的型付けされていて、書いてみましょうになります:これを可能に似somethhingある

def map = new HashMap<complicated generic expression>(); 
+0

Scalaと同じです。これらの言語は、様々なインスタンス化ステートメントから型を推論できる構文を提供します。これは、.NETでvarキーワードを使用して提供されるものに似ています。これを混乱させないように、弱い(または緩やかな)タイプの言語と混同しないでください。 JVMは依然としてコンパイルされたコードに強い型付けを強制します。 –

4

一般的な方法では、タイプの推論の制限された形式を使用して、繰り返しを避けることができます。

例:あなたが機能

<K, V> Map<K, V> getSomething() { 
     //... 
    } 

を持っている場合は、使用することができます。

final Map<String, Object> something = getsomething(); 

の代わり:

final Map<String, Object> something = this.<String, Object>getsomething(); 
3

を使用Factory Patternジェネリックの作成:

メソッドのサンプル:Shog9言及

public Map<String, Integer> createGenMap(){ 
     return new HashMap<String,Integer>(); 

    } 
2

擬似のtypedefアンチパターンが働くだろう - アンチパターンを使用することをお勧めしませんけれども - それはあなたの意図に対応していません。擬似typedefの目標は、宣言の混乱を減らし、読みやすさを向上させることです。

あなたが望むのは、ジェネリック宣言のグループを1つのトレードで置き換えることです。私はあなたが停止して考える必要があると思う: "魔女の方法でそれは貴重ですか?"私はあなたがこれを必要とするシナリオを考えることができません。クラスAを想像してください:

class A { 
    private Map<String, Integer> values = new HashMap<String, Integer>(); 
} 

「値」フィールドをマップに変更したいとします。同じ変更が必要なコードを介して他の多くのフィールドが散在しているのはなぜですか? '値'を使用する操作に関しては、単純なリファクタリングで十分です。