2017-03-15 1 views
2

私は物流クエリのための安らかなAPIを作成しようとしています。パラメータで実装する方法を選択するにはJavaで

shipping_idとtracking_numberの2つのパラメータを受け取り、サードパーティのAPIを呼び出して結果を取得し、何か処理します。

異なる企業によって数多くの第三者APIが提供されており、呼び出すにはshipping_idの値によって異なります。

私の解決策は、このようなものです:

スーパークラスのLogisticsQueryController "
、多くのサブクラスがあるでしょう:
'ALogisticsQueryController'、 'BLogisticsQueryControllerは' ... 'LogisticsQueryController' を拡張します。

マップを保持する( 'shipping_id' => 'class_dir')。
shipping_idを指定すると、shipping_idでclass_dirを取得し、リフレクションを使用して新しいインスタンスを取得できます。

しかし、Javaでのリフレクションが非効率である可能性があると聞いたので、より良い解決策は何ですか?

+0

はい反射は非効率的です。あなたのシナリオでリフレクションを使用する理由がわかりませんでした。 –

+0

jax rsやその他のフレームワーク(springmvcコントローラ)を使用していますか?フレームワーク全体がリフレクションを使用していると思いますので、リフレクションに起因するパフォーマンスの問題については心配しません。しかし、配送IDが場所の一部になるようなサービスURLを変更することはできますか(パラメータを取得するのではなく、たとえばhost.com/rest/service1/shippingid1)?その後、コントローラーを関連するURL(および出荷ID)に直接マップすることができます – fairtrax

答えて

1

一般に、反射は「通常の」バイトコードよりも「高価」です。

しかし、すでに「ネットワークに直面している」というインターフェースについては話しています。

このようなリフレクションの使用が全体の応答時間に10ミリ秒を追加しても、そのペナルティは許容されるかもしれません - 拡張が容易な、きれいなメインテナンス可能なアーキテクチャを作成するのを助けると仮定します。将来他のサードパーティライブラリを追加してください。

したがって、答えは次のとおりです。まず、リフレクションの使用目的がパフォーマンスに大きな影響を与えるかどうかを判断します。そして、リフレクションを使用することがあなたのアーキテクチャーの過度の品質に本当に役立つかどうかを評価します。

一方、ファクトリインターフェイスとそのインターフェイスのさまざまな実装を作成するだけで、リフレクションを使用せずに必要なオブジェクトを作成する方法を知ることはできませんでしたか?そして、それらのファクトリのインスタンスを単にマップに配置します。

+1

ありがとう、私は工場を試します。私はかつてリフレクションがクラスのカプセル化 を傷つけると思うので、私はそれを好まない。 –

2

はい反射は非効率です。あなたのシナリオでリフレクションを使用する理由がわかりませんでした。あなたの静的ファクトリメソッドを通じて、各shipping_idに対して特定の実装の新しいインスタンスを取得するためのファクトリデザインパターンの実装はどうでしょうか?

+0

ありがとうございます。簡潔で包括的な答えです。 –

+0

あなたが役に立ったと感じたらそれを受け入れてください –

関連する問題