1. ホーム
  2. java

[解決済み] Androidにおけるシングルトン vs. アプリケーションコンテキスト?

2022-03-14 09:54:58

質問

思い出すこと シングルトンを使用する際のいくつかの問題点を列挙した記事 Androidアプリケーションでシングルトンパターンを使っている例をいくつか見ましたが、グローバルなアプリケーションの状態(android.os.Applicationをサブクラス化してcontext.getApplication()で取得)を通じて共有するシングルインスタンスの代わりにシングルトンを使用することは良い考えなのか疑問に思います。

両方のメカニズムにはどのような利点/欠点があるのでしょうか?

正直なところ、私はこの記事と同じ答えを期待しています。 Webアプリケーションでシングルトンパターン、いいアイデアではない!? が、Androidに適用される。正しいですか?それ以外のDalvikVMでは何が違うのでしょうか?

編集部:いくつかの点を絡めてご意見を伺いたいと思います。

  • シンクロナイゼーション
  • 再利用性
  • テスティング

どのように解決するのですか?

Dianne Hackbornの回答には、とても同意しかねます。私たちは、実際に必要なときに簡単に再作成できる軽量でタスクスコープ付きのオブジェクトを採用するために、プロジェクトからすべてのシングルトンを少しずつ削除しています。

シングレットはテストにとって悪夢のような存在で、いい加減に初期化すると 状態不確定性。 の呼び出しを移動させると、突然表面化することがあります)。 getInstance() をあるスコープから別のスコープへ移動させる)。もう一つの問題として、可視性が挙げられます。 グローバル(=ランダム) 共有状態にアクセスできるため、並行アプリケーションで適切に同期されていない場合、微妙なバグが発生する可能性があります。

私はこれをアンチパターンだと考えています。本質的にグローバルな状態を維持することになる、悪いオブジェクト指向のスタイルなのです。

質問に戻ります。

アプリコンテキストはシングルトンそのものと言えますが、フレームワークで管理され、明確に定義された ライフサイクル スコープ、およびアクセスパスがあります。したがって、もしアプリのグローバルな状態を管理する必要があるなら、それはここに置くべきで、他のどこにも置くべきではないと私は考えています。それ以外の場合は、次のことを再考してください。 本当に あるいは、シングルトン・クラスを書き換えて、タスクを実行する小さな短命のオブジェクトをインスタンス化することも可能でしょう。