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