2008-08-26 13 views
15

私はCVSブランチをマージしていますが、大きな変更の1つは、スタティックな初期化ブロックとすべての静的メソッドを持つ抽象クラスを持つシングルトンパターンのどこに置き換えられるかです。Java Singletonと静的 - 実際のパフォーマンス上の利点はありますか?

このリファクタリングを価値があるものと見なすには、どのような状況が予想されますか?多くのコンフリクトをマージする必要があるため、これは価値がありますか?

我々は、WebLogic 8.1の下でトーマスは、

...私は明確にしましょうHEADのバージョンは、伝統的なシングルトンパターン(プライベートコンストラクタを持っている(ので、JDK 1.4.2)


は申し訳ありませんが、このアプリを実行しています

ブランチバージョンにはコンストラクタがありません。 'public abstract class'であり、オブジェクト上のすべてのメソッドが 'static'に変更されています。プライベートコンストラクタ内に存在していたコードは、静的ブロックに移動されます。

次に、クラスのすべての用途が変更され、マージで複数の競合が発生します。

この変更が加えられたケースはいくつかあります。

答えて

15

厳密な実行時パフォーマンスの観点からは、その差は実際にはごくわずかです。この2つの主な違いは、静的なライフサイクルがクラスローダーにリンクされているのに対して、シングルトンの場合は通常のインスタンスライフサイクルであるという点です。通常、ClassLoaderビジネスから離れる方がよいでしょう。特に、Webアプリケーションをリロードしようとすると、いくつか問題を避けることができます。

+1

シングルトンは、ロードされたクラスローダーのClassLoaderの有効期間と同じくらい静的なものです。 –

+5

そして?すべてがClassLoaderの生涯に結びついていますが、シングルトンを置くことで余分なライフサイクルレイヤーが得られ、適切に処理するチャンス(ファイナライズ)が増えます。 –

0

このディスカッションは役に立ちましたか?

Sun Discussion on this subject

評決はそれを作るていないことのようです)(=他のプログラミングフォーラムへのリンクをタブーだ場合、私は知らないが、私はむしろちょうど全体の議論を引用していないと思います)技術的には静的メソッドがより効率的ですが、ほとんどの場合、問題とは十分に違いがあります。

3

オリジナルの投稿が正しく理解されていて、リンク先のSunからのディスカッションが正確であれば、明快さとパフォーマンスの間にトレードオフを入れなければならないと思います。

は自分自身にこれらの質問をする:

  1. シングルトンオブジェクトは、私はより明確にやっているありますか?
  2. このタスクを実行するにはオブジェクトが必要ですか、それとも静的メソッドに適していますか?
  3. シングルトンを使用しないことで得られるパフォーマンスが必要ですか?
+0

質問は実際にはパフォーマンスの向上に関するものです:-) 1秒あたり100リクエストを処理するコントローラがあるとします。これは、ステートレスサービスとしてのシングルトンまたはクラスの選択に関係しますか? – lisak

16

ステートを格納する必要がある場合はシングルトンを、それ以外の場合は静的なクラスを使用します。何かを格納する必要がある場合を除いて、何かをインスタンス化することには意味がありません。

3

私の経験から言えば、ユニットテストではどちらが賢明なのかが重要です。私はいつもシングルトンがより簡単で自然なものだと感じました。あなたの組織がJMockitを使用できるようにしている場合、これらの懸念を克服できるので問題はありません。

11

静的メソッドおよびフィールドはサブクラスで拡張または上書きできないため、静的は拡張性には問題があります。

単体テストでも悪いです。単体テストでは、クラスローダーを制御することができないため、異なるテストの副作用が流出するのを防ぐことはできません。 1つの単体テストで初期化された静的フィールドは別の単体テストで表示されるか、悪化すると同時にテストを実行すると予測できない結果が生じます。

シングルトンは、控えめに使用すると、一般的にokパターンです。私はDIフレームワークを使い、私のインスタンスを管理することを好む(おそらく、Guiceのように異なるスコープ内で)。

0

パフォーマンスを測定するためのコードを記述します。答えはJVM(SunのJDKはJRockitとは異なる動作をする可能性があります)とアプリケーションが使用するVMフラグに依存します。

関連する問題