2

Web サービスからキーと値のペアのリストを受け取り、次のコードを継承しています。

public String iconValue = null;
... (over 50 class variables assigned in MyObject constructor below)

public MyObject(List<Attribute> attrs) {

    String attrName, attrValue;

    for (Attribute a : attrs) {
        try
        {
            attrName = a.getName();
            attrValue = a.getValue();

            if (attrValue == null || "".equals(attrValue.trim()))
                continue;

            if (ICONS.equals(attrName)) {
                //Do something including assignment
                this.iconValue = attrValue;
            }
            else if (URL.equals(attrName)) 
            {
                //Do something including assignment
            }
            else if (...)  A giant list of over 50 different attributes hardcoded
            {
                //Do something including assignment
            }

            ...

したがって、ハッシュマップを保持することを除いて、クラス内にハードコードされた変数を保持し、この「when-if」パターンを使用する上記よりも良い方法はありますか?

また、この模様に名前はありますか?

4

4 に答える 4

4

私が考えることができる 1 つの方法は、巨大な if else, esp を実行する代わりに、ENUMs を使用して各オブジェクトに動的に作業をディスパッチすることです。s は名前で検索できるためですENUMENUM

それは作戦パターンのようなものだろう。

例えば:

  1. インスタンスごとにENUMメソッドを持つように を実装します。doJob()
  2. valueOf()作品の発送方法をご利用ください。

コードサンプル:

public enum Strategies {
    URL {
        @Override
        public void doJob(MyObject mo) {
                // do the work
        }
    },
    ICONS {
        @Override
        public void doJob(MyObject mo) {
                // another work
        }
    };
    public abstract void doJob(MyObject mo);
}

そして、それを使用するとき、

try {
    Strategies.valueOf(attrName).doJob();
} catch (IllegalArgumentException e) {
    // ENUM does not exist, illegal parameter
}
于 2013-04-25T13:41:11.040 に答える
0

名前はないと思いますが、「ポリモーフィズムの使用が間違っている」と呼ぶことができます (型の安全性が懸念される場合)。明確に定義されたデータ コントラクトがあるかどうかによって異なります。受け取っているデータは適切なオブジェクトですか、それとも単に「ランダムな」データですか?

それが適切なオブジェクトである場合は、具体的な表現を作成し、Dozer などを使用して (または、依存関係に縛られたくない場合は、リフレクションを使用して独自のマッパーをロールします)、それらの間で変換します。

多かれ少なかれランダムなデータである場合は、マップまたは同様のデータ構造を使用します。

于 2013-04-25T13:54:04.627 に答える