4

私が政府と呼ばれるクラスを作っていると仮定します。政府には、役員、大臣、部門などのメンバーがいます。これらのメンバーごとにインターフェイスを作成し、特定の政府が好きなように定義します。

Government クラスのメイン メソッドは と呼ばれServe(Request req)ます。クエリ レートが非常に大きい (1 秒あたり 1000 以上のクエリ) と仮定します。

政府を作成するには、次のことができます
。1) Java ジェネリックを使用して記述Government<Class Minister, Class Officer, ...>し、特定の政府実装では、Java コードで独自の政府オブジェクトを作成し、main()デプロイ可能な jar を用意する必要があります。

2) 役員、大臣などのクラス名を指定する構成ファイルを用意し、Serve()呼び出されるたびに and を使用Class.forName()Class.newInstance()てクラスのオブジェクトを作成します。新しい政府は、そのメンバーのクラスと構成ファイルを作成するだけで済みます。main()すべての政府に1 つのシングルがあります。

純粋にパフォーマンスの観点から - どちらが優れており、その理由は何ですか? 私の主な懸念事項は次のとおりです。

a)forName()コストのかかる検索を毎回実行しますか? クラスの非常に大きな宇宙を仮定します。

b) 動的クラスで、ケース 1 では実行される可能性があるがケース 2 では実行されない可能性のあるコンパイラーの最適化を見逃していますか?

4

3 に答える 3

2

As long as you reuse your goverment object, there is no difference at runtime. Difference isonly at object creation time.

1 & 2 differ in concept - 1 ist hardwired, while 2 is dynamic ( you may even use DI contrainers like spring, guice or pico - basically you proposed to write your own )

As for forName() performance - it is up on classloader ( and also on container ) . MOst of them would cache name resolution results, look up in map - but I can not speak for all

As for optimisations - there are compiler optimisations, and also agressive runtime optiomisations from JIT compilers - they matter more.

于 2011-12-15T13:18:49.500 に答える
0

理解できません。これら2つは代替手段ではありません。それらはほぼ直交しています。ジェネリックスはコンパイル時の構造です。消去され、実行時に何にも変換されません。一方、呼び出しによるクラスのロードforNameは実行時のものです。一方は他方に影響を与えません。

ジェネリックスを使用している場合は、実行時にクラスオブジェクトが必要ないことを意味します。ジェネリックスでは、明示的に渡さない限り、クラスオブジェクトにアクセスできないためです。実行時にクラスオブジェクトが必要ない場合は、それをロードする必要がないことを意味するforNameため、と矛盾しforNameます。クラスオブジェクトを明示的に渡す場合、それはすでにクラスオブジェクトがあり、それをロードする必要がないことを意味します。これも。と矛盾しforNameます。

于 2011-12-15T22:40:16.767 に答える
0

あなたの説明は、「依存性注入を使用したいのですが、自分でロールバックする必要がありますか?」のようなものです。

Spring (または Guice by Google) を調べてください。春を想定します。

スタッフのインターフェースを作成し、Spring でそれぞれに使用する実装を構成します。

于 2011-12-15T22:52:56.837 に答える