2011-07-15 4 views
2

JAXBツールから生成されたpojos、それらのいくつかのドメインクラスなどがあります。大きなアプリケーションでは、オブジェクトの1つのセットからデータを取得し、オブジェクトの別のセットに入れなければなりません。データを使用する能力が異なります。Javaオブジェクト間でデータをコピーする最速の方法は何でしょうか?

これを行うさまざまな方法があります。オブジェクトマッピングフレームワークは明白な選択です。しかし、堅実なコードベースとコミュニティを持つこれらのフレームワークのほとんどは反射を使用します(dozerなど)

訪問者パターンにpojosとより複雑なJavaクラスを採用するアダプターの組み合わせを使用しています。アダプターを歩いているビジターは、オブジェクトの1セットを歩き、そのプロセスで別のオブジェクトセットを作成します(通常、オブジェクトには親/子/ツリータイプの参照があります)。特に、新しい文字列などを作成するのではなく、利用可能な最速の方法でなければなりません。

他の方法はありますか?メモリ内のバイト配列へのシリアライゼーションのいくつかの並べ替え、その後、逆シリアル化?それはパフォーマンスの点で訪問者ベースのコピーを打つことができますか?私はドーザーのような反射に基づくアプローチに不公平なのですか?これはアプリケーションの重要な操作です。そのため、すべての改善が全体的なパフォーマンスを大幅に向上させる可能性があります。

+0

オブジェクトは直列化可能にするために 'serializable'を実装する必要はありませんか? – bdares

+0

@bdares:それは特定のアプローチに従うための要件です。すべてのオブジェクトがシリアライズ可能であると仮定します。それに向けてフレームワークを持ちますか? – mahonya

答えて

2

訪問者のパターンは、パフォーマンスのためにかなり最適に近いはずです。シリアライゼーションに関係するものは、あらゆる種類の一般化されたマッピングのオーバーヘッドのために悪化します。

私はドーザーには特に慣れていませんが、本質的に手書きで書くことを自動化するために使用されている場合、反射はそれほど大きなヒットである必要はありません。つまり、クラス(または同等の論理ツリー)を生成してコピー操作を定義した後、この操作を繰り返し実行するとします。リフレクション費用は、多数の操作にわたって償却され、無視できる程度になります。

+0

ドーザーは私の手書きアダプターの必要性の大部分を排除することでここで助けます。中期的には、私はアダプター/訪問者を自動的に生成するものについて考えています。私は、オブジェクトの作成量を減らすためにアダプタをメモリに保持することも考えています。 – mahonya

0

データを転送し、実際には2つの異なるクラスのフィールドの複合オブジェクトを作成しないことが心配なら、私はファサードを提案します。ファサードは、いくつかの異なるオブジェクトへのディスパッチであり、2つのオブジェクトから1つのデータ転送オブジェクト(DTO)を返します。あなたが機能を実行するが、複合体を返していないので、

http://en.wikipedia.org/wiki/Facade_pattern

一部の人々が主張するだろう、これは私はまだそのアプローチとなるだろう、コンポジットまたはラッパーまたはアダプタが、どちらの方法で呼び出されます。

私は通常ここから:1日の終わりに

http://www.javacamp.org/designPattern/

1

を、あなたは本当にベンチマークと最小要件を必要とします。

コピーの最小時間要件をすでに満たしている場合は、コードの変更や移動を避けることができます。そうしないと、最小要件を満たしたときに中止することができます。

すべての「高速」な方法には、少し速いかもしれない他の方法が常にあります。最小限の要件を指定すると、これを高速にする必要があるか(早すぎるものを最適化するだけなのか)、さらに速くするためにリソースを投入するのをやめるべきかがすぐに分かります。

良いJavaベンチマークを作成するのは難しいことではありませんが、試してみる前に読んでください(悪いベンチマークを作るのは非常に簡単です)。

+1

ライブラリでない限り、最良のアプローチはベンチマークではありませんが、コードをプロファイリングしてどちらが遅いかを確認します。もちろん、コードの速度がすでにOKであれば、プロファイリングする必要はなく、そうでない場合は遅い部分を見つけて、最適化して結果を再度確認してください。 – stivlo

1

ファサードパターンのアダプターはいい考えです。データをコピーする回数が減るほど、より良い結果が得られます。また、データを不変にすることをお勧めします。これにより、今後の並行性の問題を避けることができます。

私はメモリ内のシリアル化、特にフォーマットの変更を避けています。

同じように反映されます。オブジェクトがたくさんあり、手作業でアダプタを作成したくない場合は、モデル駆動型アプローチを使用して、ビルドプロセスの一部としてアダプタを生成する方がはるかに優れています。

関連する問題