より多くの意見を求めて、私は質問を書き直します(私は質問の仕方を学んでいて、英語は私の母国語ではありません)...
すべてのメソッドとグローバル変数を静的に保つことは冗長ですか、それともベストプラクティスですか?(つまり、インスタンス自体はすでに1つしかないということです)
どのメソッドもクラスの状態 (インスタンス属性) に依存しない場合は、シングルトンは必要ありません。単純にすべてを次のように宣言しstatic
ます。その場合、ユーティリティ クラスが作成されます (これが質問で提案されている 2 番目のアプローチです)。 )。
一方、メソッドがクラスの状態に依存し、クラスのインスタンスが常に1つだけ存在することを確認する必要がある場合は、シングルトンを使用します(これが質問で提案された最初のアプローチです)。
2 番目のアプローチは実際にはシングルトンとは見なされないことに注意してください。定義上、シングルトンは「クラスのインスタンス化を 1 つのオブジェクトに制限することによって、シングルトンの数学的概念を実装するために使用される」パターンであり、すべてのstatic
メソッドを持つクラスはそうではありません。インスタンス化する必要はまったくありません。
編集 :
シングルトン クラスでの静的メソッドの呼び出しに関しては、オブジェクト インスタンスで静的メソッドを呼び出すのは悪いスタイルと見なされます。シングルトンかどうかは関係ありません。これは、以前の投稿で広範に議論されています。static
したがって、一貫性を保つために、インスタンス属性に依存していなくても、シングルトンのすべてのメソッドを non- として宣言し、シングルトンを介してすべてにアクセスする方がよいと思います(質問の最初のアプローチ)。 .
クラスが何らかのリソースを使用する場合、またはシングルトンの初期化にコストがかかる場合は、通常、努力する価値があります。
シングルトンを使用すると、オブジェクトの存続期間をより適切に制御できます。静的コンストラクターは、静的メソッドがアクセスされる前に呼び出されることが保証されていますが、静的コンストラクターを強制的に再度実行する方法はありません。
シングルトン オブジェクトはテストが簡単です。静的メソッドを介したインターフェイスを持つ方法はありません。
シングルトンは、おそらく単一のオブジェクトではなく、リソースのプールなど、別の実装パターンに簡単に変換できます。
静的メソッドを持つクラスに対するインスタンス メソッドを持つシングルトンの利点は、次のことができることです。
これは、特にこのシングルトンに依存するメソッドを単体テストする場合に大きな違いをもたらします。同じインターフェースを実装するシングルトンの別のモック インスタンスを渡すことができます。
「哲学的問題」だと思います。
それが私が頻繁に呼び出すメソッドであり、シングルトンへの他の呼び出しがない場合は、2 番目の方法を好みます。
MyClass.doSomethingElse()
静的メソッドを使用して問題を解決できる場合は、そのようにしてください。シングルトン インスタンスを取得する必要がないため、記述が簡単で短くなります。ただし、シングルトンが必要な典型的なケースは次のとおりです。
重要な点は、これらのいずれかまたは類似のものが必要な場合、静的ユーティリティ クラスが適用されない理由がわかります。次に、シングルトンにアップグレードします。