- PR -

新人SEのためのJava講座についての質問

投稿者投稿内容
ひで720
会議室デビュー日: 2002/12/16
投稿数: 9
投稿日時: 2002-12-16 11:34
始めまして。Java初心者のひで720です。
新人SEのためのJava講座のサンプルを作成しながら勉強
しています。(1)文字列の置換処理で共通ブックマークを
作成するところで質問があります。私もこの例題に習って
共通の処理を一つにまとめてクラスを作成したいと考えて
いますが、そういった場合はサンプルのとおりメソッドは
クラスメソッドにするのが一般的なのでしょうか。
本や、インターネットでいろいろ調べたのですが"static"
の使い方がよくわかりませんでした。"static"はどのよう
な場面で使用するのが正しいのですか。
初心者の為、低レベルで大変お恥ずかしい質問ですがご教授
願います。
m.hosoi
会議室デビュー日: 2002/10/10
投稿数: 13
お住まい・勤務地: 東京
投稿日時: 2002-12-16 13:19
お役にたてるかわかりませんが、
私がstaticにするメソッドは、
そのクラスのstaticではないフィールド(メンバ変数)を使わないメソッドです。

↓この例のようにclass Testがどんな状態でも(null以外)funcの結果は変わらない場合は
 staticにします。
class Test{
public int func(int a,int b){
return a + b;
}
}

しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-12-16 15:08
class AClass { .. } として、

AReturn ret = AClass.staticMethod(args);

とアクセスしたいものは static、

AClass anObject = new AClass();
anObject.method(args);

とアクセスしたいものは static でなくします。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2002-12-16 16:11
引用:

しょむさんの書き込み (2002-12-16 15:08) より:
class AClass { .. } として、

AReturn ret = AClass.staticMethod(args);

とアクセスしたいものは static、

AClass anObject = new AClass();
anObject.method(args);

とアクセスしたいものは static でなくします。




こんにちわ。
私もしょむさんと同じ感覚で使用してます。
Utilityクラスはstaticでね!とか。

しかし、これはとても趣向が入ってますよね。
staticにしなければならない理由なんてないです。

staticにしなければならない時ってどういう時でしょうね?
(コンパイルエラーになるような場合は除いて)

あと、ちょっと疑問なんですが、
コード:
public class hoge {
  private static int a = 0;

}

public class moge {
  private int b = 0;

}



上記の場合、int aがメモリ領域に確保されるのはクラスがロード
された時?ではint bが確保されるのは?クラスがロードされる時
ではない?

ここらへん曖昧です。

どなたか間違いご指摘ください・・。
pon
常連さん
会議室デビュー日: 2002/05/21
投稿数: 43
投稿日時: 2002-12-16 17:11
もし共通的に使いたい(計算や値編集など)処理を静的に持たず
動的に持つとしたらどうなるでしょうか?
インスタンス化され、終わったら破棄されて・・・

しなければいけないという事はないですが、したほうが良いとは言えますね。
#敢えて規約を作るとしたらそうするべしでしょうね。

用途、使用頻度によって使い分けましょう。
#どっちでもいいならそもそも定義されていません。
ayum
常連さん
会議室デビュー日: 2002/03/28
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 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/09/10
投稿数: 376
投稿日時: 2002-12-16 17:57
引用:

コード:
public class hoge {
  private static int a = 0;

}

public class moge {
  private int b = 0;

}



上記の場合、int aがメモリ領域に確保されるのはクラスがロード
された時?ではint bが確保されるのは?クラスがロードされる時
ではない?

ここらへん曖昧です。

どなたか間違いご指摘ください・・。



自己フォローです。
どうやら私はクラスとインスタンスの認識が曖昧であったため
こういう疑問を抱いていたようです。

クラスはあくまで入れ物ですね。インスタンスは中身を伴ったもの。
クラスは抽象的ですね。インスタンスは具体的。

staticフィールドはクラスで共通の変数。
non staticフィールドはインスタンスで共通の変数。

一つのクラスには複数のインスタンスが含まれますね。
よってstaticフィールドは複数のインスタンス全てから参照可能であり
そしてインスタンス(オブジェクト)が破棄されてもフィールドの値は
破棄されない。

逆にインスタンス変数はインスタンス(オブジェクト)の破棄とともに
値も破棄されますね。

なんとなくjava worldを見ていて、ちょうど載っていました。
よく読んでみたらこんな感じなんだろうとひらめきました。

合ってますかねぇ?
ひで720
会議室デビュー日: 2002/12/16
投稿数: 9
投稿日時: 2002-12-16 18:38
ひで720です。初歩的な質問に答えていただきありがとうございました。
みなさんのご意見から察するに共通的(ユーティリティメソッド)に使う
場合はstaticにしたほうが良いということですかね。文字列チェックとか
文字列の長さチェックとか・・・

引用------------------------------------------------------
ayumさんの書き込み (2002-12-16 17:29) より:

ユーティリティ的なメソッドをMonoStateパターンとして
staticで実装するのは私もよくやりますが、
上記の理由も考慮してstaticやめてSingletonパターンを使うべきかどうかを
考慮に入れてみる必要はあるかもしれません。
まぁ、本当にユーティリティメソッド群であれば大抵MonoStateでもいいのですが。
----------------------------------------------------------
勉強不足でXXXパターンという言葉も初めて聞きました。いろいろなパターンが
あるんですね。興味を持ちました。

ちなみにstaticメソッドにしたユーティリティメソッドを別の複数のクラス
から同タイミングで使用した場合、何か不具合が発生するのでしょうか?
低レベルの質問で申し訳ありませんがご教授願います。

スキルアップ/キャリアアップ(JOB@IT)