- ベストアンサー
Javaの静的メソッドとインスタンスメソッドの使い分けについて
- Javaの静的メソッドとインスタンスメソッドの使い分けについて理解が不十分です。静的メソッドはインスタンスメンバ変数を必要としない処理に使用され、インスタンスメソッドはインスタンスメンバ変数を参照する処理に使用されます。
- DAOを例に挙げると、select、update、insertなどの処理はクラスのインスタンスメンバ変数を必要としないため、静的メソッドにすべきです。しかし、一部のDAOのサンプルプログラムでは、これらのメソッドがインスタンスメソッドとして作成されています。
- なぜselect、update、insertのメソッドをインスタンスメソッドにする必要があるのか理解できません。静的メソッドとインスタンスメソッドの使い分けの基準を教えていただきたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
オブジェクトの状態(非スタティックフィールド)や型によって、実行時に動作を変えたい場合は非 static メソッドを使う必要が有ります。 下記の例では、Adding や Multiplication はインスタンスフィールドを持っていませんが、calc オブジェクトの実装型に拠る処理の振分けを行う為、execメソッドは非スタティックである必要が有ります。(ポリモーフィズムの利用) class Sample { public static void main(String[] args) { System.out.println(compute(2, 3, new Adding())); System.out.println(compute(2, 3, new Multiplication())); } static int compute(int a, int b, Calc calc) { return calc.exec(a, b); } } interface Calc { int exec(int a, int b); } class Adding implements Calc { public int exec(int a, int b) { return a + b; } } class Multiplication implements Calc { public int exec(int a, int b) { return a * b; } } まあ、こんな単純で非実用的な処理ではあまりメリットは見えませんが、規模が大きくなってきた場合には、ポリモーフィズムをうまく使うと、明示的な条件判定をあまり増加させずに動作のバリエーションを増やす事が出来ます。 また、DAOが状態を持つ必要が出てくるケースは有り得ます。 例えば、Connection を取得する方法を柔軟に切替えたい場合、Connection 取得のインターフェースを作り、いくつかの実装を用意した上で、DAOクラスにその Connection 取得オブジェクトを持たせるようにすれば良い訳です。 static フィールド、メソッドの問題点は、下記の記事が分かりやすいと思います。 http://capsctrl.que.jp/kdmsnr/wiki/bliki/?StaticSubstitution もちろん、static フィールド、メソッドの使用が悪い訳では有りません。引数のみに依存する事が正当なメソッドやシステムの中で唯一で有るべき状態は static にするべきでしょう。 (例 : java.lang.Math内のメソッド、singleton を保持するフィールド、etc.)
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
ややピントがずれている気がしますが、合ってると思います。 静的メソッド:インスタンスを操作しない処理 インスタンスメソッド:インスタンスを操作する処理 インスタンスの操作=インスタンスメンバ変数のアクセス+インスタンスメソッドの呼び出し というか、「何をするメソッドか」を考えれば自明。
お礼
認識が全くの的外れではないことを確認できて良かったです。ありがとうございました。
基本的には、使い分けの基準は質問者さんの認識通りで良いと思います。ケース・バイ・ケースもあるでしょうけれども。 ソフトウェア・メトリクスの研究から生まれた、Javaソースコードを品質検査する「J.Taster」という商用ソフトがまさに同じ基準で静的メソッドの用法を判定します。もしソース中にインスタンスメンバ変数を参照していないインスタンスメソッドを発見すると、それは静的メソッドにすることを検討しなさいと警告してきます(残念ながら、このソフトは既に販売を終了しているようですが)。 http://itpro.nikkeibp.co.jp/members/NOS/ITARTICLE/20020619/2/ http://staff.aist.go.jp/takagi.hiromitsu/#research
お礼
そのようなソフトがあったとは知らなかったです。提示していただきありがとうございました。
お礼
ポリモーフィズムやリンク先のような考え方をすればインスタンスメソッドでも納得できました。サンプルコードもありがとうございます。 staticをつけるかつけないかで常に悩んでいたので判断基準が増えて良かったです。 ありがとうございました。