質問を解決したかっただけです。プライベートな可視性を持つ通常のメソッドとは対照的に、プライベートな静的メソッドを持つことのポイントは何ですか?
静的メソッドを持つことの利点は、クラスのインスタンスなしで呼び出すことができることだと思っていましたが、そのプライベートは静的であるというポイントさえありますか?
私が考えることができる唯一の理由は、オブジェクトレベルではなく、クラスレベルでメソッドを概念的に理解するのに役立つということです。
質問を解決したかっただけです。プライベートな可視性を持つ通常のメソッドとは対照的に、プライベートな静的メソッドを持つことのポイントは何ですか?
静的メソッドを持つことの利点は、クラスのインスタンスなしで呼び出すことができることだと思っていましたが、そのプライベートは静的であるというポイントさえありますか?
私が考えることができる唯一の理由は、オブジェクトレベルではなく、クラスレベルでメソッドを概念的に理解するのに役立つということです。
回答:
静的であるという特性は、可視性とは無関係です。
静的メソッド(非静的メンバーに依存しない一部のコード)が必要になる理由は依然として有用です。しかし、多分あなたは誰か/他の人にそれを使わせたくない、あなたのクラスだけを。
<
する<
...それが書き込まれると、などを
&
、&
[コードを記述&
し&
ている場合、必要だとは思わなかったとしても変換しますが、ありません]。それはそれは、後にアンパサンドを処理するために必要となりますが、この方法は、それが拡大して変化する、公開されている&
ために&
、独自の実行外コード壊れる可能性があり&
-to- &
置換を。ただし、メソッドがプライベートの場合、&
外部コードに問題を引き起こすことなく処理するように修正できます。
かなり一般的な理由(Javaの場合)は、単純なprivate static
メソッドを使用してコンストラクターの混乱を減らすことにより、コンストラクターで不変フィールド変数を初期化することです。
private
:外部クラスはそれを見るべきではありません。static
、それはいくつかの操作を行うことができます独立した:1ホストクラスの状態に。やや不自然な例が続きます...
例えば:
public class MyClass{
private final String concatenated;
public MyClass(String a, String b){
concatenated = concat(a,b);
}
public String getConcatenated(){
return concatenated;
}
/**
* Concatenates two Strings as `s1---s2`
**/
private static final String concat(String s1, String s2){
return String.format("%s---%s", s1, s2);
}
}
1 他のstatic
変数との相互作用がないと仮定します。
super(...)
あなたはスーパーの呼び出しに渡すものをうまく支援するために、ローカル変数を宣言することはできませんので、呼び出しは、あなたのクラスのコンストラクタの最初の行でなければなりません。ただし、(プライベート)静的メソッドを呼び出すことができます。このメソッドは、スーパーコンストラクターに渡す値を計算するために必要な行を使用します。
多くのメソッドで数行のコードが繰り返されていることがわかります。そのため、重複したコードは適切ではないため、それらを単一のメソッドに抽出することにします。
このメソッドは広く使用されるように設計されていないため、メソッドをプライベートにし、無関係なコードを呼び出すことは望ましくありません。(コメントでこの点を議論します…。)
メソッドはインスタンスフィールドにアクセスしないため、静的にすることができます。静的にすると、理解しやすくなり、少し速くなる場合もあります。
その後....(たぶん今、多分後で、多分決して)
メソッドを静的にすると、クラスからユニティクラスに移動できることは明らかです。
また、パラメータの1つのインスタンスメソッドに変換するのも簡単です。多くの場合、これはコードがあるべき場所です。
一般に、プライベート静的メソッドを作成していることに気付いた場合は、個別にモデル化する必要があるものがあることを示すものと見なします。
特定のオブジェクトインスタンスの状態に関連付けられていないため、パブリックおよびプライベートの静的メソッドのコレクションは、独自のセマンティクスと非静的メソッドを備えた完全に独立したクラスを形成できます。
(別のヒントは、すべてが特定のタイプの共通パラメーターを持っている静的メソッド(パブリックおよびプライベート)をたくさん持っている場合、そのタイプのメンバーとしてより良いかもしれません。)
したがって、質問に答えるために、クラスがそのクラスのインスタンスに依存しない関連メソッドのグループを提供するときに、プライベート静的メソッドが表示されます。(...そして独立しているので、彼らは自分のクラスでより良いかもしれません。)
私が考えることができる非常に単純な例は、メイン関数に渡される入力引数に対して何らかの処理(または何らかの操作)を行いたい場合です。したがって、この場合、処理が大きく、同じ機能が他のどこでも使用されない場合、プライベート関数を使用することは理にかなっています。