3

Foo myFoos のリストが与えられた場合、それらを別のクラス (Bar など) のコレクションにマップする必要があります。私は今このようにします:

List<Bar> myBars = new...
for(Foo f : foos) {
    Bar b = new Bar();
    b.setAProperty(f.getProperty);
    b.setAnotherProp(f.getAnotherProp);
    myBars.add(b);
}

それで、これを行う簡単な方法はありますか?確かにこれは非常に簡単ですが、特に入力リストが大きくなる可能性があるため、手動でリストをたどる必要なく foo をバーに変形する魔法があるかどうか疑問に思っています。
そうでない場合、コンパイラがこれを最適化するために何かを行うかどうか知っていますか? 私は主にパフォーマンスについて心配しています。

ありがとう!

--
ラッパル

4

4 に答える 4

7

すべてのアイテムを変換する必要があるため、リストをたどることを避けることはできません!

ただしBarFoo. 次に、ループは次のようになります。

for(foo f : foos) {
    myBars.add(new Bar(f));
}

シナリオによっては、 のリストをまったく作成しないという代替手段もありますBar。代わりに、メソッドを追加するだけで、必要に応じてオブジェクトFoo.getAsBar()を動的に生成できます。Barコンテナー内の要素の数が、それらにアクセスする必要がある合計回数よりも多い場合、これはより効率的である可能性があります。

于 2011-06-08T15:19:47.510 に答える
0

別のアイデアは、非常にまれなケースでのみ適切です。

Fyweightパターン(の種類)を実装する

前提条件:とのプロパティのセットはFoo同じBarです。

  • Fooとの共通プロパティをBar外部クラスに入れますProperties
  • PropertiesFooとBarのタイプのプロパティを実装します。
  • の新しいインスタンスを作成し、Barから初期化する場合は、インスタンスから新しいインスタンスにFooプロパティを渡すだけです。FooBar

長所:

  • プロパティのコピーを作成する必要はありません

短所:

  • プロパティセットはFooとBarで同じである必要があります
  • プロパティアクセスでの追加の間接参照(=オーバーヘッド)
  • Barのプロパティを変更すると、Fooの元のプロパティに影響します。


    public class Properties {
        public int getPropertyA() {..}
        public int getAnotherProperty() {..}
    }
    public class Foo {
        Properties properties;
        public Foo(Properties properties)
            this.properties = properties;
        }
        public Properties getProperties() {
            return properties;
        }
    }
    public class Bar {
        Properties properties;
        public Foo(Properties properties)
            this.properties = properties;
        }
        public Properties getProperties() {
            return properties;
        }
    }
    //Client code:
    //Access properties:
    int i = foo.getProperties().getPropertyA();
    //Map Foos to Bars
    for (Foo foo: foos) {
        Bar bar = new Bar(foo.getProperties());
        //Do something with bar
    }

于 2011-06-09T08:50:43.473 に答える
0

一般的な解決策ではありませんが、状況によっては適切なアイデアの 1 つ:

プロパティをプルする

Bar がインスタンス化されるたびに Foo から Bar にプロパティをプッシュする代わりに、単に Foo を新しい Bar に関連付け、プロパティ ゲッターでプロパティをマップします。

  • いずれにせよ、Bar のすべてのインスタンス/プロパティがクライアントによってアクセスされるわけではない場合、これは良いことです。
  • ただし、クライアントが Bar インスタンス/プロパティに繰り返しアクセスすると、パフォーマンスが低下します。

public class Bar {
  Foo foo;
  public Bar(Foo foo) {
      this.foo = foo;
  }
  public int getPropertyA() {
      return foo.getPropertyA();
  }
  public int getAnotherProperty() {
      return foo.getAnotherProperty();
  }
}

これは、Foos をループして Bars をインスタンス化することを妨げません。ただし、プロパティをマップする作業が遅れます。

于 2011-06-09T08:24:17.597 に答える