0

Mapオブジェクトに特定の値型を含める必要があります。

Map<String,Object> foo = new HashMap<String,Object>();
foo.put("1",new Integer(1));
foo.put("2", new String("hello"):
for (Map.Entry<Integer, Integer> entry : foo.entrySet()) {
    if(entry.getValue() instanceof String) {
    //do something
    }
   else if(entry.getValue() instanceof Double) {
       //throw Exception
    }
}

あなたは私が達成しようとしていることを見ることができます。Mapオブジェクトに特定のValueタイプが必要なので、if/elseステートメントをたくさん入れる必要はありません。どうすればこれを達成できますか?

4

2 に答える 2

3

複数のマップを持つという考えが気に入らない場合は、オーバーライドと呼ばれる優れた OOP 機能を使用できます。詳細については、オーバーライド メソッドを参照してください。

おそらく、構成パターンを使用して値の型をラップし、値の型に応じてアクションのインターフェイスを定義します。

public abstract class ValueType {

    public abstract void valueSpecificAction(); 
}

public class DoubleValueType extends ValueType {

    private Double value;

    public DoubleValueType(Double value) {
            this.value = value;
    }

    public void valueSpecificAction() {
        //do double specific actions
    }
}

public class StringValueType extends ValueType {

    private String value;


    public void valueSpecificAction() {
        //do string specific actions


     }   
}

次に、タイプValueTypeのオブジェクトをマップに追加できます。

Map<String,ValueType> foo = new HashMap<String,ValueType>();
foo.put("key1", new DoubleValueType(42.0));

後で、特定のタイプに応じて処理を行うpublic メソッドvalueSpecificAction()を使用して、タイプ ValueType を持つ値を取得できます。

于 2012-09-30T20:38:29.597 に答える
0

一般的にどこかに if-else を持たないようにする方法がわかりません。

Janのソリューションは、計算時に値の型を決定できる場合にのみ、if-elseを節約します。上記のおもちゃの例ではそうですが、実際の問題ではそうですか?

コードをきれいに見せたい場合は、一連のプライベート メソッドで常に if-else と変換を非表示にすることができます。

于 2012-09-30T23:32:48.653 に答える