15

私は CVS ブランチをマージしていますが、より大きな変更の 1 つは、静的初期化ブロックとすべての静的メソッドを持つ抽象クラスを使用したシングルトン パターンの置換です。

これは、多くの競合をマージする必要があるため、保持する価値があるものですか?

このアプリは Weblogic 8.1 (つまり JDK 1.4.2) で実行しています。


すみません、トーマス、はっきりさせてください..

HEAD バージョンには従来のシングルトン パターン (プライベート コンストラクター、getInstance() など) があります。

ブランチ バージョンにはコンストラクターがなく、「パブリック抽象クラス」であり、オブジェクトのすべてのメソッドが「静的」に変更されています。プライベート コンストラクターに存在していたコードは、静的ブロックに移動されます。

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

この変更が行われたいくつかのケースがあります。

4

7 に答える 7

16

状態を保存する必要がある場合はシングルトンを使用し、それ以外の場合は静的クラスを使用します。何かを格納する必要がない限り、インスタンス化しても意味がありません。インスタンスが 1 つでも構いません。

于 2008-08-26T14:59:20.503 に答える
15

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

于 2008-08-26T14:52:01.783 に答える
11

静的メソッドとフィールドはサブクラスによって拡張またはオーバーライドできないため、静的は拡張性に悪影響を及ぼします。

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

シングルトンは、控えめに使用する場合、通常は問題のないパターンです。私は DI フレームワークを使用して、自分のインスタンスを (Guice のように異なるスコープ内で) 管理できるようにすることを好みます。

于 2008-08-26T17:52:52.363 に答える
3

私の元の投稿が正しい理解であり、リンクされた Sun からの議論が正確である場合 (おそらくそうであると思います)、明快さとパフォーマンスの間でトレードオフを行う必要があると思います。

次の質問を自問してください。

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

私の経験から、重要なのは単体​​テストでどちらがより簡単にモックできるかだけです。私はいつも、Singleton の方が簡単で自然にモックアウトできると感じていました。組織が JMockit の使用を許可している場合でも、これらの問題は解決できるので問題ありません。

于 2008-08-26T15:14:26.630 に答える
0

この議論は役に立ちますか? (別のプログラミング フォーラムにリンクすることがタブーかどうかはわかりませんが、議論全体を引用するだけでは不十分です =) )

Sun このテーマに関するディスカッション

技術的には静的メソッドの方が効率的ですが、ほとんどの場合、問題になるほどの違いはないと判断されたようです。

于 2008-08-26T14:50:44.987 に答える
0

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

于 2008-09-09T01:44:43.197 に答える