- 締切済み
staticの使用場所
現在人が書いたソースを読むことが多くなっているのですが、 staticがいっぱい使われているものにたまに遭遇します。 今までの私の考えでは、 固定値変数定義では、static finalで定義するが、 その他ものはなるべくstaticを利用しないと考えていました。(メソッドなど) しかし、現在ちょっと他人のソースを見ているとこの考えに自信がなくなってきました。 皆さんはJavaでプログムするときにstaticメソッド等はどのように使ってます?? 一概には言えないでしょうけど、 こういう時には、staticで定義した方がいい。 こういう時には、staticは止めておいた方がいい。 など何かありますか? 差し支えのない所でいいですので教えてください。 (処理速度、保守の観点から見た場合などもあればお願いします)
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- winterofmeei
- ベストアンサー率22% (20/88)
No1です。 私が想定した状況は、No5のtorakiyojpさんの指摘されたケース1~ケース3全てに該当していません。しかし、どちらにしろ今回の本質とは少々(大分?)ずれている感もありますね。この部分は無視していただいて結構です。失礼しました。 以上駄文でした。
- torakiyojp
- ベストアンサー率58% (25/43)
torakiyojpです。 winterofmeeiさんの回答引用 > また、これが変数を10000個も宣言しているクラスだとしたら、staticで宣言する方法と、そのたびにインスタンスを生成する方法のどちらがいいかは火を見るより明らかです。 うーん。自信は余りないのですが、変数10000個は余り関係ない気がします。 case1:static変数が10000個 これはクラスに対して10000個あるので、インスタンスの生成時に数は関係ない。 case2:インスタンス変数が10000個 この場合はstaticメソッドからは呼び出せない。(確かコンパイルエラー) 必ずstaticでないメソッドから呼び出される。 メソッドにstaticを付ける付けないの議論にならない。 case3:メソッド中のローカル変数が10000個 staticメソッドもそうでないメソッドも同じ数のインスタンス生成。 つまり、クラスを何回newするかしないかの違いであり、変数の数は関係ないように思えるのですが・・・ おっしゃりたい事を取り違えている可能性も十分にありますが・・・ rikiponponさんへ ここらへんの話はSJC-Pの勉強をすると出てくると思います。実は私も少しずつ勉強中。 興味があればSJC-Pのテキスト等を読んでみたらいかがでしょうか。
これまでの回答にあるとおり、staticは必要なときにつけるものなので、どんなとき?といわれると、例を挙げることしかできないのですが・・・。 ユーティリティクラス的なものを作る場合、static付きメソッドがいっぱい作られますね。 例を挙げるとjava.lang.Mathとかjava.util.Arraysみたいなやつです。 これらは計算するだけのメソッドとか配列の操作メソッドがあるだけで、newして使うことはありません。 特徴は自分の状態を表すデータがなく、操作だけがあることです。 どんなにオブジェクト指向的につくってもある程度はこういったクラスができてしまうことは仕方ありません。 ですが、あまりにそういうクラスが多い場合はそのシステム全体がオブジェクト指向設計を行っていないと思ったほうが良いでしょう。 私がstaticを使うとき・・・Singletonのときは使いますね。Xxxx.getInstance()とか。
- winterofmeei
- ベストアンサー率22% (20/88)
No1です。 > staticということはずっとメモリに残っているんですよね? > だったら、使用するときにインスタンス化したほうがいいのではないでしょうか? 「何が」メモリにずっと残っていると仰るのでしょうか? また、これが変数を10000個も宣言しているクラスだとしたら、staticで宣言する方法と、そのたびにインスタンスを生成する方法のどちらがいいかは火を見るより明らかです。 ただ、確かにこのメソッドはstaticであろうとなかろうと正常に動作はします。私自身はデバッグに掛ける労力を極力少なくするためにstaticをつけると思いますが。 > メソッドの中でオブジェクトを作成していない場合は積極的にstaticを利用するとありました。 単にこの文章だけ書かれていたら私でも「なぜ?」と疑問に思いますね。これは余談でした。
- torakiyojp
- ベストアンサー率58% (25/43)
torakiyojpです。はじめまして。 rikiponponさんの補足引用 -------------------------------------------------- たとえば、 CSV形式のStringの配列にするメソッドがあるとします。 その時に、staticにせずに、StrignUtilみたいなクラスで定義して、 そのクラスをインスタンス化して使う方法と staticにしてStringUtil.メソッド名 で呼び出す方法はどちらが一般的に使われているかということです。 まあ、この場合はstaticにしたほうがいいのかな? となんとなく思うのですが、では、なぜstaticなの?? と問われたら私にはわかりません。 -------------------------------------------------- この件に関する私の見解はつい最近答えているので、こちらを参考にしてください。 http://okweb.jp/kotaeru.php3?q=968645 rikiponponさんの補足引用 -------------------------------------------------- あるページで、 メソッドの中でオブジェクトを作成していない場合は積極的にstaticを利用するとありました。 これは、以下のようなメソッドのことですよね? public staic int plus(int a,int b){ return a+b; } 確かにstaticにしてもおかしくはないと思いますが、 何故staticにする必要があるのでしょうか? staticということはずっとメモリに残っているんですよね? だったら、使用するときにインスタンス化したほうがいいのではないでしょうか? -------------------------------------------------- インスタンス化して何度もヒープ上に無駄なオブジェクトを作ってしまう方が、メモリの無駄な気がしますが・・・ static宣言すると、その変数やメソッドはクラスに対して存在することは理解されていますよね?それを考えると、staticを止めておいた方がいいというより、staticにしてはいけない場合は、わかりますよね? 私の知識はJavaの参考書などに書いてあるレベルなので参考にならないかもしれませんが・・・
- winterofmeei
- ベストアンサー率22% (20/88)
> 固定値変数定義では、static finalで定義するが、 > その他ものはなるべくstaticを利用しないと考えていました。(メソッドなど) ここで質問するよりもう一度、Javaの参考書などを読み直されてはいかがでしょうか?本質を勘違いされている気がします。 > こういう時には、staticで定義した方がいい。 > こういう時には、staticは止めておいた方がいい。 > など何かありますか? staticは「つけた方がいい」「つけない方がいい」というものではなく、必要なときにそれで宣言するものです。
補足
その必要なときというのはどういう時なのかがわからにのです。 たとえば、 CSV形式のStringの配列にするメソッドがあるとします。 その時に、staticにせずに、StrignUtilみたいなクラスで定義して、 そのクラスをインスタンス化して使う方法と staticにしてStringUtil.メソッド名 で呼び出す方法はどちらが一般的に使われているかということです。 まあ、この場合はstaticにしたほうがいいのかな? となんとなく思うのですが、では、なぜstaticなの?? と問われたら私にはわかりません。 必要だと思ったて作っていたらオブジェクト指向ではなく手続き型のコーディングになっていることがあると思うのですがどうでしょう? あるページで、 メソッドの中でオブジェクトを作成していない場合は積極的にstaticを利用するとありました。 これは、以下のようなメソッドのことですよね? public staic int plus(int a,int b){ return a+b; } 確かにstaticにしてもおかしくはないと思いますが、 何故staticにする必要があるのでしょうか? staticということはずっとメモリに残っているんですよね? だったら、使用するときにインスタンス化したほうがいいのではないでしょうか? ※こんなメソッドなんて作らないという突っ込みはしないでください。。すぐに思いついたのがこれだったもので・・・・