- - PR -
新人SEのためのJava講座についての質問
1|2|3
次のページへ»
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2002-12-16 11:34
始めまして。Java初心者のひで720です。
新人SEのためのJava講座のサンプルを作成しながら勉強 しています。(1)文字列の置換処理で共通ブックマークを 作成するところで質問があります。私もこの例題に習って 共通の処理を一つにまとめてクラスを作成したいと考えて いますが、そういった場合はサンプルのとおりメソッドは クラスメソッドにするのが一般的なのでしょうか。 本や、インターネットでいろいろ調べたのですが"static" の使い方がよくわかりませんでした。"static"はどのよう な場面で使用するのが正しいのですか。 初心者の為、低レベルで大変お恥ずかしい質問ですがご教授 願います。 | ||||||||
|
投稿日時: 2002-12-16 13:19
お役にたてるかわかりませんが、
私がstaticにするメソッドは、 そのクラスのstaticではないフィールド(メンバ変数)を使わないメソッドです。 ↓この例のようにclass Testがどんな状態でも(null以外)funcの結果は変わらない場合は staticにします。 class Test{ public int func(int a,int b){ return a + b; } } | ||||||||
|
投稿日時: 2002-12-16 15:08
class AClass { .. } として、
AReturn ret = AClass.staticMethod(args); とアクセスしたいものは static、 AClass anObject = new AClass(); anObject.method(args); とアクセスしたいものは static でなくします。 | ||||||||
|
投稿日時: 2002-12-16 16:11
こんにちわ。 私もしょむさんと同じ感覚で使用してます。 Utilityクラスはstaticでね!とか。 しかし、これはとても趣向が入ってますよね。 staticにしなければならない理由なんてないです。 staticにしなければならない時ってどういう時でしょうね? (コンパイルエラーになるような場合は除いて) あと、ちょっと疑問なんですが、
上記の場合、int aがメモリ領域に確保されるのはクラスがロード された時?ではint bが確保されるのは?クラスがロードされる時 ではない? ここらへん曖昧です。 どなたか間違いご指摘ください・・。 | ||||||||
|
投稿日時: 2002-12-16 17:11
もし共通的に使いたい(計算や値編集など)処理を静的に持たず
動的に持つとしたらどうなるでしょうか? インスタンス化され、終わったら破棄されて・・・ しなければいけないという事はないですが、したほうが良いとは言えますね。 #敢えて規約を作るとしたらそうするべしでしょうね。 用途、使用頻度によって使い分けましょう。 #どっちでもいいならそもそも定義されていません。 | ||||||||
|
投稿日時: 2002-12-16 17:29
staticメソッドの方が通常のインスタンスメソッドより
呼び出しにかかるオーバーヘッドは小さいので、 大量にループが回る中で大量にコールされるメソッドは たま〜にprivateでもstaticにしたりしますね。 まぁ、staticの方が早いといっても微々たるものなので、 余程大量にそのメソッドがコールされるのでなければ 体感レベルではそんなには変わりませんが。 あと、staticメソッドはインスタンスではなくクラスに属するという特性上、 オーバーライドできないという問題があります。 ので、サブクラスでオーバーライドしたいメソッドには使えません。 (JDK1.3ではバグ的にできたような・・・?) ユーティリティ的なメソッドをMonoStateパターンとして staticで実装するのは私もよくやりますが、 上記の理由も考慮してstaticやめてSingletonパターンを使うべきかどうかを 考慮に入れてみる必要はあるかもしれません。 まぁ、本当にユーティリティメソッド群であれば大抵MonoStateでもいいのですが。 以下はMonostateパターンとSingletonパターンについてご参考まで http://www.hyuki.com/dp/dpinfo.html#Monostate http://www.hyuki.com/dp/dpinfo.html#MonostateAndSingleton | ||||||||
|
投稿日時: 2002-12-16 17:57
自己フォローです。 どうやら私はクラスとインスタンスの認識が曖昧であったため こういう疑問を抱いていたようです。 クラスはあくまで入れ物ですね。インスタンスは中身を伴ったもの。 クラスは抽象的ですね。インスタンスは具体的。 staticフィールドはクラスで共通の変数。 non staticフィールドはインスタンスで共通の変数。 一つのクラスには複数のインスタンスが含まれますね。 よってstaticフィールドは複数のインスタンス全てから参照可能であり そしてインスタンス(オブジェクト)が破棄されてもフィールドの値は 破棄されない。 逆にインスタンス変数はインスタンス(オブジェクト)の破棄とともに 値も破棄されますね。 なんとなくjava worldを見ていて、ちょうど載っていました。 よく読んでみたらこんな感じなんだろうとひらめきました。 合ってますかねぇ? | ||||||||
|
投稿日時: 2002-12-16 18:38
ひで720です。初歩的な質問に答えていただきありがとうございました。
みなさんのご意見から察するに共通的(ユーティリティメソッド)に使う 場合はstaticにしたほうが良いということですかね。文字列チェックとか 文字列の長さチェックとか・・・ 引用------------------------------------------------------ ayumさんの書き込み (2002-12-16 17:29) より: ユーティリティ的なメソッドをMonoStateパターンとして staticで実装するのは私もよくやりますが、 上記の理由も考慮してstaticやめてSingletonパターンを使うべきかどうかを 考慮に入れてみる必要はあるかもしれません。 まぁ、本当にユーティリティメソッド群であれば大抵MonoStateでもいいのですが。 ---------------------------------------------------------- 勉強不足でXXXパターンという言葉も初めて聞きました。いろいろなパターンが あるんですね。興味を持ちました。 ちなみにstaticメソッドにしたユーティリティメソッドを別の複数のクラス から同タイミングで使用した場合、何か不具合が発生するのでしょうか? 低レベルの質問で申し訳ありませんがご教授願います。 | ||||||||
1|2|3
次のページへ»
