- - PR -
インスタンス変数の宣言について
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-03-24 21:50
こんばんは。中村と申します。
色々と、他の人のソースや専門書及び雑誌のサンプルソースをみていて、 インスタンス変数の宣言の仕方はどれがいいの?という場面に出くわします。 以下に思い当たる宣言の仕方を列挙いたします。 宣言の方法が複数あるだけに、ケースバイケースで使い分けるのでしょうが、 その使い分け方をご教授願いませんでしょうか? (1)プリミティブ型 int number; int number = 0; (2)String String name = null; String name = ""; String name; (3)通常クラス Vector list = null; Vector list = new Vector(); Vector list; | ||||||||
|
投稿日時: 2004-03-24 23:16
インスタンス変数の初期化は決まっているので、
(1)どっちも同じ。 (2)一番上と一番下が同じ (3)一番上と一番下が同じ になります。 あとは、そのクラスが作られた際にどういう状態でほしいのかによるんで、千差万別でしょう。 | ||||||||
|
投稿日時: 2004-03-24 23:29
(1)ですが、
int number; の後に number の値を参照しようとするとコンパイルエラーになります。 (number++; など) int number = 0; のように 0 で初期化することを明記しておけばコンパイルエラーにはなりません。 私は int number = 0; のように書くように癖をつけています。 [追記] これはメソッド内のローカル変数について説明したのですが、 質問には「インスタンス変数の宣言の仕方はどれがいいの」と書いてありましたね。 完全に質問を勘違いしていました。すいません。 さらに自分の書いたソースを見返すとローカル変数であっても初期化していない こともありました。後で参照するケースが多いので初期化するケースの方が多いですが。 [ メッセージ編集済み 編集者: yuzy 編集日時 2004-03-25 00:13 ] [ メッセージ編集済み 編集者: yuzy 編集日時 2004-03-25 00:26 ] | ||||||||
|
投稿日時: 2004-03-24 23:42
インスタンス変数は、初期値を明示的に与えない場合の初期値が、言語仕様できまっていますよ。例えばbooleanならfalse、intやlongなら0、オブジェクト参照ならnullです。
メソッドローカル変数は、初期化しないで演算したりメソッドコールの引数に与えたりすると コンパイルエラーになります。 言語仕様の解説を参照してください。 http://www.y-adagio.com/public/standards/tr_javalang/4.doc.htm#10931 | ||||||||
|
投稿日時: 2004-03-24 23:53
unibon です。こんにちわ。
#少し本題から逸れますが。
これはインスタンス変数ではなく、ローカル変数のことだと思います。
たとえば C 言語ならばローカル変数をやみくもに初期化することは、不定な値を参照してしまう可能性をなくすということで、良い意味があると思います。一方で、Java ではローカル変数に不定な値が入ることはない(コンパイル時にエラーになる)ので、不要な初期化に利点はないです。 かといってコンパイルエラーを出さなくするためにやみくもに初期化するのも、やはり利点はないです。 | ||||||||
|
投稿日時: 2004-03-25 00:07
私は個人的にコンストラクタで初期化するのが好きなので、
あまりインスタンス変数の宣言時には初期化しないです。 ただ大事なのは、特徴を知っておきケースバイケースで 使い分けられるようにすることだと思います。 (1) 上下とも同じ (2) String name = null; と String name; は同じ String name = ""; だと空文字列のインスタンスが 代入されるので、メソッドを使っても例外が発生しなく なります。 (3) Vector list = null; と Vector list;は同じ Vector list = new Vector(); だとインスタンスが 代入されているので、いきなり使用できるようになります。 | ||||||||
|
投稿日時: 2004-03-25 00:17
どうもありがとうございます。中村です。
そのクラスが作られた時の状態の例として、 private static Demo demo = new Demo(); private Demo(){} public static Demo getInstance() { return demo; } クラスのロード時にStaticなインスタンス変数に自クラスのインスタンスをセットして、 getInstance()でそれにアクセスする→シングルトン みたいなことをおっしゃっていますよね? | ||||||||
|
投稿日時: 2004-03-25 00:33
みなさまどうもありがとうございます。中村です。
学生時代にC言語を少しかじり、社会人になってからJava言語を勉強しております。 標題を質問するに当たり、C言語の知識が曖昧だったため、 umibonさんの説明の部分がひっかっかっておりました。 どうもありがとうございました。 [/quote] たとえば C 言語ならばローカル変数をやみくもに初期化することは、不定な値を参照してしまう可能性をなくすということで、良い意味があると思います。一方で、Java ではローカル変数に不定な値が入ることはない(コンパイル時にエラーになる)ので、不要な初期化に利点はないです。 かといってコンパイルエラーを出さなくするためにやみくもに初期化するのも、やはり利点はないです。 [/quote] | ||||||||
