プライベート静的メソッドの使用
プライベート静的メソッドの使用についてどう思いますか?
個人的には、staticprivateメソッドをnon-staticとして使用することを好みますインスタンスフィールドへのアクセスを必要としない限り。
しかし、この慣習はOOP原則に違反すると聞いた。
編集:私はパフォーマンスではなく、ビューの将来のスタイルから疑問に思っています。
private static
メソッド自体はOOP自体に違反しませんが、インスタンスフィールドにアクセスする必要がない(そしてできない*)クラスにこれらのメソッドが多数ある場合、 OOの方法でプログラミングします。なぜなら、「オブジェクト」は、状態+一緒に定義された状態に対する操作を意味するからです。
(*)=原則として、Javaのクラスレベルの可視性により、クラスの静的メソッドhasそのクラスのオブジェクトのインスタンスフィールドへのアクセス、たとえば:
class Test
{
int field = 123;
private static void accessInstance(Test test)
{
System.out.println(test.field);
}
}
もちろん、インスタンスへの参照(this
ポインター)を自分で渡す必要がありますが、基本的にはインスタンスメソッドを模倣しています。完全を期すためにこれに言及するだけです。
前述のように、プライベート静的メソッドは、再利用されたロジックを整理し、繰り返されるコードを削減/排除するのに役立ちます。この議論でパフォーマンスについて言及していなかったことに驚いています。ルノー・ヴァルデュラの「ファイナル・オン・ファイナル」から:
(プライベート静的メソッドは暗黙的にfinalであることに注意してください)
「最終メソッドは宣言クラスでのみ実装されるため、最終メソッドへの呼び出しを動的にディスパッチする必要はなく、代わりに静的呼び出しを使用できます。コンパイラは、通常の呼び出しを完全にバイパスして、メソッドへの直接呼び出しを発行できます仮想メソッド呼び出し手順。このため、最終メソッドは、Just-In-Timeコンパイラーまたは同様の最適化ツールによるインライン化の候補でもあります(プライベート/静的メソッドは既に最終であるため、この最適化では常に考慮されます)。
論文全体をご覧ください: http://renaud.waldura.com/doc/Java/final-keyword.shtml
プライベートでもパブリックでも違いはありません-静的メソッドは大丈夫ですが、常にそれらを使用していることがわかった場合(そしてもちろん、インスタンスフィールドにアクセスしないインスタンスメソッドは、基本的にはこの目的のための静的メソッドです)、その後、おそらく設計を再考する必要があります。常に可能であるとは限りませんが、ほとんどの場合、メソッドは操作対象のデータと共に存在する必要があります-これがOOPの基本的な考え方です。
私は必ずしもあなたがやっていることで実際の問題を見ることはありませんが、私の最初の質問は、メソッドがインスタンスフィールドへのアクセスを必要としない場合、最初にそのクラスで何をしていますか?
好みの問題ですが、オブジェクト内の状態に静的に反応しないメソッドを作成します。このように、静的関数が同様の機能を必要とする場合、コードを書き直す必要はありません。ソート関数は、このような場合の良い例です。
私はプライベートな静的メソッドを使用しない傾向があります。パブリックな静的メソッドを使用し、それらをUtilクラスにグループ化して、再利用を促進しています。
プライベート静的メソッドは、たとえば、そのクラスのプライベート静的メンバーで動作できます。これを利用して、特定のクラス固有の操作をカプセル化および統合できます。
静的メソッドを使用する主な欠点は、オーバーライドする可能性を捨てるという事実です。 Javaのクラスは、Smalltalkのクラスとは異なりますので、静的メソッドをオーバーライドすることはできません。
あなたの質問はプライベートな静的メソッドに関連しているので、とにかくオーバーライドはオプション外です。
静的メソッドは、ユーティリティクラス(Java.lang.Mathなど)またはシングルトンパターンのようなパターンの場合にのみ使用する傾向があります。これらはすべて、クラスから他に提供されるサービスを表すため、プライベートよりも高い可視性を必要とします。
最終的な考え:プライベート静的メソッドが1つ以上ある場合は、それらを専用のユーティリティクラスに抽出してパブリックにすることを検討してください。さらに良いことに、それらをインスタンスメソッドにし、シングルトンパターンを使用します。