- PR -

インスタンス変数の宣言について

投稿者投稿内容
ナカムラ
会議室デビュー日: 2004/03/21
投稿数: 12
投稿日時: 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;


アティ
ベテラン
会議室デビュー日: 2003/08/14
投稿数: 91
お住まい・勤務地: KANAGAWA
投稿日時: 2004-03-24 23:16
インスタンス変数の初期化は決まっているので、
(1)どっちも同じ。
(2)一番上と一番下が同じ
(3)一番上と一番下が同じ
になります。
あとは、そのクラスが作られた際にどういう状態でほしいのかによるんで、千差万別でしょう。
yuzy
大ベテラン
会議室デビュー日: 2002/02/14
投稿数: 117
投稿日時: 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/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-24 23:42
インスタンス変数は、初期値を明示的に与えない場合の初期値が、言語仕様できまっていますよ。例えばbooleanならfalse、intやlongなら0、オブジェクト参照ならnullです。
メソッドローカル変数は、初期化しないで演算したりメソッドコールの引数に与えたりすると
コンパイルエラーになります。

言語仕様の解説を参照してください。
http://www.y-adagio.com/public/standards/tr_javalang/4.doc.htm#10931
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-03-24 23:53
unibon です。こんにちわ。
#少し本題から逸れますが。

引用:

yuzyさんの書き込み (2004-03-24 23:29) より:
(1)ですが、
int number;
の後に number の値を参照しようとするとコンパイルエラーになります。
(number++; など)


これはインスタンス変数ではなく、ローカル変数のことだと思います。

引用:

yuzyさんの書き込み (2004-03-24 23:29) より:
int number = 0;
のように 0 で初期化することを明記しておけばコンパイルエラーにはなりません。

私は int number = 0; のように書くように癖をつけています。


たとえば C 言語ならばローカル変数をやみくもに初期化することは、不定な値を参照してしまう可能性をなくすということで、良い意味があると思います。一方で、Java ではローカル変数に不定な値が入ることはない(コンパイル時にエラーになる)ので、不要な初期化に利点はないです。
かといってコンパイルエラーを出さなくするためにやみくもに初期化するのも、やはり利点はないです。
コガちゃん
会議室デビュー日: 2003/12/13
投稿数: 10
投稿日時: 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/21
投稿数: 12
投稿日時: 2004-03-25 00:17
どうもありがとうございます。中村です。

引用:

アティさんの書き込み (2004-03-24 23:16) より:
あとは、そのクラスが作られた際にどういう状態でほしいのかによるんで、千差万別でしょう。




そのクラスが作られた時の状態の例として、
  private static Demo demo = new Demo();

  private Demo(){}

  public static Demo getInstance()
  {
    return demo;
  }
クラスのロード時にStaticなインスタンス変数に自クラスのインスタンスをセットして、
getInstance()でそれにアクセスする→シングルトン
みたいなことをおっしゃっていますよね?

  
ナカムラ
会議室デビュー日: 2004/03/21
投稿数: 12
投稿日時: 2004-03-25 00:33
みなさまどうもありがとうございます。中村です。

学生時代にC言語を少しかじり、社会人になってからJava言語を勉強しております。
標題を質問するに当たり、C言語の知識が曖昧だったため、
umibonさんの説明の部分がひっかっかっておりました。
どうもありがとうございました。

[/quote]
たとえば C 言語ならばローカル変数をやみくもに初期化することは、不定な値を参照してしまう可能性をなくすということで、良い意味があると思います。一方で、Java ではローカル変数に不定な値が入ることはない(コンパイル時にエラーになる)ので、不要な初期化に利点はないです。
かといってコンパイルエラーを出さなくするためにやみくもに初期化するのも、やはり利点はないです。
[/quote]

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