2

シングルトンクラスと静的クラスの違いは何ですか?しかし、違いを知っていると、私は選択する必要があるたびにまだ混乱を感じています。

したがって、私は2つの異なるケースを定義しました-このクラスのインスタンスが1つだけ(非常にまれです)、すべてのサービスクラスの静的クラス(非常に頻繁に発生する)がある場合は、主にPOJOクラス(Java)にシングルトーンを使用しています)。

たとえば、私のアプリケーションでは、メッセージを保存し(シリアル化可能なクラスMessageがあります)、ファイルに書き込み、ファイルから読み取り、実行時にアクセスする必要があります。ここでシングルトンを使用する理由はわかりません。静的クラスは問題ありません。唯一の静的クラスはMessageStorageであり、読み取り、書き込み、getMessagesの3つの関数と、メッセージの静的プライベート配列リストが1つあります。

このアプローチは合理的ですか?そうでない場合、その問題は何ですか?

4

3 に答える 3

1

Javaで「シングルトン」を使用する2つの主な理由は次のとおりです。

1)したがって、一部のストレージは、それ以外の場合は「静的」クラスに関連付けることができます。

2)特定のサービスの異なるサブクラス(またはインターフェイス実装)に対して複数の「シングルトン」があり、使用する特定のサービスを識別する方法としてシングルトンが渡される場合。

もちろん、#1の代わりに、「静的」クラスの静的フィールドを使用してデータを含めることができますが、多くの場合、サブジェクトクラスの単一のインスタンスにデータを含める方が便利です(多くの場合、より効率的です)。データと、他のクラスのインスタンスである複数の静的メンバー。

そして、#2に関しては、「定数」を定義することを装って、事実上、複数の「シングルトン」を実装する単一クラスのJDKに多くのケースがあります。(例:java.awt.font.TextAttribute。)

一般に、シングルトンを持つ動機は、Cベースの言語よりもJavaの方が少なくなります。これは、Javaが真のクラス関連(およびクラス保護)静的データを実装するのに対し、 C言語であるため、クラスに複数の静的フィールドを含めることができますが、C言語のフィールドを含めるための「中央」オブジェクトを用意する必要があります。

于 2011-12-19T03:43:28.510 に答える
1

理想的なデザイン:-)

  • MessageStoreはインターフェースである必要があります
  • MessageStoreFactoryは、getMessageStore()メソッドを持つシングルトンである必要があります(getMessageStore()が毎回同じメッセージストアを返す場合、それは問題ではなく、シングルトンがあります)。
  • その後、FileMessageStore、JDBCMessageStore、SubversionMessageStoreなどの複数のMessageStore実装を持つことができます...
  • 最も重要なことは、MockMessageStoreを使用して、メッセージストアをモックアウトし、メッセージストアとは独立してメッセージストアに依存するコンポーネントをテストできることです(障害を特定できます)。たとえば、MessageViewをテストしていてエラーが発生した場合、MockMessageStoreが正しい場合、エラーが静的MessageStoreではなくMessageViewにあることを確認できます。

とにかく、それはクールな子供たちが今日やっていることです...そして工場ではなく依存性注入ですが、一度に一歩...

于 2011-12-19T03:39:30.100 に答える
1

ここで本当に理解すべきことは、c#/javaにはさまざまなメモリグループがあるということです。

すべてのクラスは、クラスローダーメモリと呼ばれるメモリのセクションにロードされます。静的なものを作成すると、それはクラスローダーメモリに残ります。そこから使用できますが、インスタンスを1つだけ持つことができます。クラスローダーメモリ用のガベージコレクタはありません。アプリケーションの存続期間中、すべてがそこにとどまります。

シングルトンであるかどうかに関係なく、クラスのインスタンスを作成するということは、メモリコピーが実行され、クラスローダーメモリからクラスがコピーされ、インスタンスが格納されている領域にコピーされることを意味します。インスタンスはガベージコレクションできます。

シングルトンと静的クラスのオプション間の実際の決定ポイントは次のとおりです。

1)継承が必要ですか、それともクラスのインターフェースが必要ですか(シングルトンが必要な場合)
2)クラスにアプリケーションと同じライフサイクルを強制することは理にかなっていますか(つまり、手動でクリアする必要があります)クラスを作成するか、それを実行するメソッドを作成します。これにより、コードが不必要に増加し、保守性が低下します)。(そうでない場合は、シングルトンが必要です)
3)アプリケーションにはスケーラビリティと変更の可能性が必要ですか。シングルトンは、静的プロパティを介して実装されている場合、今日ではアンチパターンと見なされることがよくあります。この理由は、クラスで静的インスタンスプロパティを公開するなどのインフラストラクチャに投資するためです。これは、シングルウィンドウアプリケーションが突然マルチウィンドウになり、コードを書き直す必要があるため、将来的にはまったく必要ない可能性があります。(コードの書き換えは、特にコアインフラストラクチャの場合、設計が不適切であることを示しています)。

一般的な経験則として、次のことをお勧めします。

  • クラス全体の変数があり、シングルトンである必要があるクラス(潜在的にスケールアウトする必要があるため)。
  • 各メソッドが独立しているクラスは、静的である必要があります。
于 2011-12-19T03:39:31.783 に答える