web-dev-qa-db-ja.com

プライベート静的メソッドがあるのはなぜですか?

私が持っている質問を片付けたかっただけです。プライベートな可視性を持つ通常のメソッドとは対照的に、プライベートな静的メソッドを持つことのポイントは何ですか?

静的メソッドを持つことの利点は、クラスのインスタンスなしで呼び出すことができることだと思いましたが、プライベートであるため、静的であることへのポイントさえありますか?

私が考えることができる唯一の理由は、オブジェクトレベルではなくクラスレベルでメソッドを概念的に理解するのに役立つということです。

74
Rehan Naqvi

静的であるという特性は、可視性とは無関係です。

静的メソッド(非静的メンバーに依存しない一部のコード)が必要になる理由は、引き続き役立ちます。しかし、多分あなたは誰か/他のものにそれを使わせたくないでしょう、あなたのクラスだけです。

73
Miyamoto Akira

(Javaで)かなり一般的な理由は、単純なprivate staticメソッドを使用してコンストラクター内の不変フィールド変数を初期化し、コンストラクターの混乱を減らすためです。

  • それはprivateです:外部クラスはそれを見るべきではありません。
  • staticです:独立して何らかの操作を実行できます1 Hostクラスの状態の。

やや工夫された例が続きます...

例えば:

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変数との相互作用がないと仮定します。

26

private staticメソッドの一般的な使用例は、次のユーティリティメソッドです。

  1. その1つのクラスでのみ使用されます
  2. そのクラスの内部状態に依存しない
14
Philipp

多くのメソッドで繰り返される数行のコードがあることがわかります。そのため、重複したコードは適切ではないため、それらを単一のメソッドに抽出することにしました。

メソッドは広範囲に使用するように設計されておらず、無関係なコードがそれを呼び出すことを望まないため、メソッドをプライベートにします。 (コメントでこの点について議論…)

このメソッドはインスタンスフィールドにアクセスしないため、静的にすることができます。静的にすることで、理解が容易になり、少し速くなる場合もあります。

それから...(たぶん今、多分後で、多分決して)

メソッドが静的にされると、クラスから、たとえば単一のクラスに移動できるのはclearです。

また、パラメータの1つのインスタンスメソッドに簡単に変換することもできます。多くの場合、ここにコードを配置します。

12
Ian

クラスで静的プライベートメソッドが必要になる理由は少なくとも2つ考えられます。

1:インスタンスには、クラスのすべてのインスタンス間でデータを共有しているためか、静的メソッドを直接呼び出さない理由があります。

2:パブリック静的メソッドには、直接呼び出したくないサブルーチンがあります。このメソッドは、直接ではなく、インスタンスなしで呼び出されます。

もちろん、「それはクラスが理にかなっているのを助ける」というのは、それ自体がすべての良い理由です。

2
DougM

一般に、プライベート静的メソッドを作成していることがわかった場合は、個別にモデル化する必要があるものがあることを示しています。

それらは特定のオブジェクトインスタンスの状態に関連付けられていないため、パブリックおよびプライベートの静的メソッドのコレクションは、独自のセマンティクスと非静的メソッドを持つ完全に別個のクラスを形成できます。

(別のヒントは、すべてのタイプの共通パラメーターを持つすべての静的メソッド(パブリックおよびプライベート)があることがわかった場合、それらはそのタイプのメンバーとして適しているかもしれません。)

したがって、あなたの質問に答えるために、プライベート静的メソッドは、クラスがそのクラスのインスタンスから独立している関連メソッドのグループを提供するときに表示されます。 (...そして、彼らは独立しているので、彼ら自身のクラスではより良いかもしれません。)

1
Rob