2016-09-17 7 views
0

私はいくつかの順序に依存物事アップボックスにファクトリメソッドを持っている:スプリングインジェクションしたい機能は、可変長を取ります。代わりにリストを取得するオーバーロードを提供する必要がありますか?

import com.google.common.collect.ImmutableList; 
import com.google.common.collect.Lists; 

public class ThingBoxProcessor { 
    public static ThingBox forInputThings(Thing... thingsToProcess) { 
     ThingBox thingBox = new ThingBox(); 
     for (Thing thing : Lists.reverse(ImmutableList.copyOf(thingsToProcess))) { 
      thingBox.store(thing); 
     } 
     return thingBox; 
    } 
} 

をそして、私はそうのようにそれを注入:

<bean name="Things" class="ThingBoxProcessor" factory-method="forInputThings"> 
    <constructor-arg> 
     <list> 
     <ref bean="ThingTwo" /> 
     <ref bean="ThingOne" /> 
     <!-- imagine a couple dozen other things that do different order-sensitive things --> 
     </list> 
    </constructor-arg> 
</bean> 

春が配列に変換し、その後、ArrayListに作成されていますか? 。重大なパフォーマンス上の利点のような過負荷を提供することにあります:

public static ThingBox forInputThings(Thing... thingsToProcess) { 
     return forInputThings(ImmutableList.copyOf(thingsToProcess)); 
    } 

    public static ThingBox forInputThings(List<Thing> thingsToProcess) { 
     ThingBox thingBox = new ThingBox(); 
     for (Thing thing : Lists.reverse(thingsToProcess)) { 
      thingBox.store(thing); 
     } 
     return thingBox; 
    } 

This questionは私がに興味があるものではありません私は可変引数のparamに春のXMLリストを注入することができます知っている。私はちょうどそれ以外の場合は行うには、パフォーマンス上の理由があるかどうかを知りたい)

+1

Springは、価値のあることについて、私のテストで、varargsを取るリストを取るバージョンを選択します。 私の個人的な傾向は、より洗練された、より混乱しにくいAPI(すなわち、ただ1つの機能)を好むことであり、プロファイリングがそれを問題として識別するならば、パフォーマンスについて心配することである。 – jkade

+0

そのスタイルの問題。 2つ目は、直後に破棄される不変のコピーを作成することをはっきりと回避します。 – GhostCat

答えて

1

はので、私はこの問題にどの時間を捧げるません:あなたはシングルトンを扱っていると仮定すると

は、この操作が起こってい、春の豆をスコープ一度。

プラス:設定ファイルや読み込みクラスなどを読み込む必要があるため、Springコンテキストを起動するには少なくとも数秒かかるでしょう。これと比較すると、配列と妥当なサイズのリスト(あなたがおそらくあなたのパラメータの50以上をSpringに入れないという意味で合理的です)、はブート速度に約0,000001%を追加するでしょう。

信頼性、保守性などの観点から、どのオプションを選択すべきかを考えるのは理にかなっていますが、パフォーマンス面ではそれは実際には無関係です。

関連する問題