それはかなり自明です。Java (および私が推測するすべての OO 言語) では、それが唯一の選択肢である場合、または一般的に気にしない場合、インスタンス メソッドを宣言する必要がありますか?
6 に答える
何かを処理するためにクラスの状態を知る必要がない場合、メソッドは静的です。ヘルパーメソッドは、このシナリオの良い例です。
DateUtils.getDateNowInGMT()
上記の方法では、答えを出すために状態は必要ありません。以下のものはそうです。
Withdrawer w = new Withdrawer.Builder().account(12545).build();
w.withdraw(100);
引き出しに関連付けられている状態である口座番号を知らずにお金を引き出すことはできません。もちろん、これは静的なメソッドである可能性があり、アカウント情報をメソッドに渡すことで問題は解決しますが、他のすべてのメソッドは同じアカウント情報を必要とするため、不便になります。
そのため、あらゆる種類の実装を行うことができます。しかし、可能性ではなく、基準が要件であるべきです。クラス全体で実行する操作がある場合は、静的メソッドを選択する必要があります。たとえば、インスタンスごとにuniqueIDを生成する必要がある場合や、displayやdb-driverなどのインスタンスが使用するものを初期化する必要がある場合などです。その他の場合、操作がインスタンス固有であるインスタンスメソッドが優先されます。
はい。
それが正しいアプローチであり、少なくとも私はそれに従います。
たとえば、ユーティリティ メソッドは静的にする必要があります。
しかし、ほとんどの場合、多くの将来の要件と必要な変更があり、今日それらすべてを予測することはできません. そのため、インスタンスよりも優先する必要がありますstatic
。何らかの設計パターンに従っていない限り。
メソッドを静的にすることが理にかなっている場合にのみ、メソッドを静的にする必要があります。静的メソッドはクラスに属し、その特定のインスタンスには属しません。静的メソッドは、クラスの他の静的機能のみを使用できます。たとえば、静的メソッドはインスタンス メソッドを呼び出したり、インスタンス変数にアクセスしたりできませんでした。設計しているメソッドにとってこれが理にかなっている場合は、静的を使用することをお勧めします。
また、変数またはメソッドである静的要素は、クラスのロード時にメモリにロードされ、実行が終了するまで、またはクラスローダーが属するクラスをアンロード/再ロードするまでそこにとどまります。
アプリケーションの一般的なオブジェクト指向モデリングに適合しない計算を行う場合に、静的メソッドを使用します。通常、入力データを検証するメソッド、アプリケーション実行全体に固有の情報を保持するメソッド、外部データベースへのアクセス ポイントなどのユーティリティ メソッドが、これに適した候補です。
私の知る限り、特定のオブジェクトの状態に関連するものを利用または生成するコードまたはロジックがある場合、または簡単に言えば、サイド メソッドのロジックが異なるオブジェクトをいくつかの異なる入力セットで処理し、いくつかの異なるオブジェクトを生成する場合出力のセットでは、このメソッドをインスタンス メソッドとして取得する必要があります。一方、メソッドに各オブジェクトに共通のロジックがあり、入力と出力がオブジェクトの状態に依存しない場合は、インスタンスではなく静的として宣言する必要があります。
Explaination with examples:
Suppose you are organizing a college party and you have to provide a common coupon to the students of all departments,you just need to appoint a person for distributing a common coupon to students(without knowing about his/her department and roll no.) as he/she(person) approaches to the coupon counter.
Now think if you want to give the coupons with different serial numbers according to the departments and roll number of students, the person appointed by you need to get the department name and roll number of student(as input from each and every student)
and according to his/her department and roll number he will create a separate coupon with unique serial number.
First case is an example where we need static method, if we take it as instance method unnecessary it will increase the burden.
Second case is an example of instance method, where you need to treat each student(in sense of object) separately.
この例はばかげているように見えるかもしれませんが、違いを明確に理解するのに役立つことを願っています.