• ベストアンサー

インスタンスフィールドの初期化方法

クラスのインスタンスフィールドを初期化する場合、次の3つが考えられますが、どれが一番スマートなんでしょうか。 クラスQ1はインスタンス変数int xを持つとします。 1.コンストラクタ内で初期化 e.g. Q1() {this.x = 1;} 2.宣言時に初期化 e.g. int x = 1; 3.インスタンス初期化子内で初期化 e.g. { x = 1; } Q1(){}

質問者が選んだベストアンサー

  • ベストアンサー
  • komi1341
  • ベストアンサー率65% (25/38)
回答No.1

スマート、という表現が主観的なので正解はなさそうに思います。強いて言えば、一つのプログラム内で意味もなく複数のやり方を混ぜて使うのはスマートじゃないだろうな、というくらいです。 参考までに、私は基本的にコンストラクタ内で初期化しています。staticな定数なら宣言時に初期化。インスタンス初期化子は使ったことがありませんし、人のプログラムでも見たことがありません。

20203
質問者

お礼

>>スマート、という表現が主観的なので正解はなさそうに思います。 そうですね。みんなの意見を聞いてみたいです。 >>一つのプログラム内で意味もなく >>複数のやり方を混ぜて使うのは >>スマートじゃないだろうな 確かに。 >>私は基本的にコンストラクタ内で初期化しています 私はいつも宣言時に初期化していました。 宣言時に初期化かつコンストラクタでも同じ値で初期化するのは、意味のないことでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.3

私は、趣味プログラマなので、「こうやってる」というだけですが、 3番は、初期化子の前に、宣言は必須です。よって3番は冗長なだけであり、2番の方がわかりやすくバグの危険が減ると思います。 あと、初期化データのためによほど複雑な計算があるなら、初期化子内でやることもあるのかもしれないけど、初期値にそんな複雑なデータを持たせる必要はいままでなかったので、初期化子自体使ったことがありません。 1番は、コンストラクタでの初期化時に、引数などから初期化用データをとりたいときに使います。 定数代入なら、2番にすることが多いです。eclipseを使ってると、変数の宣言部分参照で、どんなデータが入ってるかもすぐわかるので。

20203
質問者

お礼

>>3番は、初期化子の前に、宣言は必須です。 例ですので、当然先頭に宣言があります。すみませんでした。 >>2番の方がわかりやすくバグの危険が減ると思います。 この点は私も賛同です。 >>初期化データのためによほど複雑な計算があるなら、 >>初期化子内でやることもあるのかもしれない そうですね。 乱数値を代入したり、日付を取得するなどの作業は初期化子内で記述した方がスッキリするかも。 つまり、全コンストラクタ共通の処理を初期化子として独立させるには使えるかも知れませんね。 >>初期化子自体使ったことがありません。 これが多数はなのでしょうか。 >>eclipseを使ってると、変数の宣言部分参照で、 >>どんなデータが入ってるかもすぐわかるので。 この機能は知りませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • komi1341
  • ベストアンサー率65% (25/38)
回答No.2

いろいろな方の意見を聞けるといいですね。 追加の質問の件のみ回答させて頂きます。 > 宣言時に初期化かつコンストラクタでも同じ値で初期化するのは、意味のないことでしょうか。 逆にお聞きするようですが、そうすることに意味またはメリットはありますか? 私には保守性の面でのデメリットしか見えてきません。 例えばあるとき、別の値で初期化したくなったらどうするのでしょう。宣言部とコンストラクタ内と、両方修正するのでしょうか。単純に考えて面倒です。動作上はコンストラクタの方のみ値を変えれば想定通りになるでしょうが、宣言部と違う値で初期化されているのを他人が見たら、理解に苦しむでしょう。1年も放置すれば、自分のプログラムも他人が書いたものみたいに感じるものなので、未来の自分を困惑させることになるかもしれません。 そういうデメリットを上回るぐらいのメリットがないなら、いずれか一つの方法で初期化した方がよいと思います。

20203
質問者

お礼

>>私には保守性の面でのデメリットしか見えてきません。 そうですね。浅はかでした。 他の方がどの方法で初期化してるのか参考にしてみたいですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 科目を扱うためのフィールドからなるクラス

    以下のように作成するクラスsubjectのjavaプログラムがわからないので教えてください。 1.フィールド名はenglish,literature,mathematicsとし、型はすべてintとする。アクセス修飾子はどこからでも参照できるようにする(インスタンス変数) 2.コンストラクタはデフォルトのコンストラクタと1.のフィールドに値を設定するためのコンストラクタの2つを用意する。

  • 抽象クラスのインスタンスフィールドの初期化について

    早速ではございますが質問をさせていただきます。 抽象クラスのインスタンスフィールドは、いつ初期化が 行われるのでしょうか?どうかご教授のほどよろしくお願 いします。

    • ベストアンサー
    • Java
  • メソッドの引数としてのthisの意味

    java初心者です。教えてください。 メソッドの引数としてのthisは何を表しているのですか? いろいろ調べてみてthisには以下の2つの使用法があることがわかりました。 1.インスタンス変数の名前とインスタンスメソッド内のローカル変数名がかぶったときに、メソッド内でインスタンス変数を表すときにthis.変数名とする。 2.あるクラスのコンストラクタ内で、同じクラスの別のコンストラクタを呼ぶときに使う。 しかし、引数としてのthisの意味がわかりません。 具体的には、addMouseListener(this);や、g.drawImage(img,10,10,this);のthisです。 後者の場合はオブジェクトgのインスタンスメソッドなので、thisはオブジェクトgへの参照を表しているのでしょうか?

    • ベストアンサー
    • Java
  • クラスとインスタンスについて

    入社1年目のプログラミング経験0のSEです! Javaのクラスとインスタンスについてぜんぜん理解できません! 下のソースをどうしたらいいのかわからないです。 import java.io.*; class SumAndAvgMain{ public static void main(String argv[]){ BufferedReader r = new BufferedReader(new InputStreamReader(System.in),1); try{ //3教科の得点を入力しintに変換 //SumAndAvgクラスのインスタンスを作成 //合計点及び平均点を出力する。 }catch(IOException e){ System.out.println("例外発生"+e); } } } class SunAudAvg{ public static void main(String args[]){ //各教科の得点用のフィールド int kokugo; int suugaku; int eigo; //SumAndAvgクラスのコンストラクタ SumAndAvg(int kokugo,int suugaku,int eigo){ //フィールドに国語の点数を代入 //フィールドに数学の点数を代入 //フィールドに英語の点数を代入 } //3教科の合計点を求める int getGoukei(){ } //3教科の平均点を求める double getHeikin(){ } }

  • インスタンス変数の特殊な参照

    次のようなクラスを考えたときに(特に意味があるものではないですが) class A{ int a; A(){ a = 10; B b = new B(); } } class B{ int b; B(){ b = 20; C c = new C(); } } class C{ int c; C(){ c = 20; } } Cのコンストラクタの中から、Aのインスタンス変数aやBでのbの値を 参照することって出来ないのでしょうか? 変数をクラス変数にする、引数として渡す以外の方法を探しています。

  • C++変数宣言時のコンストラクタについて

    Java開発をこれまでやってきたのですが、 C++を学ぼうとしています。 C++では下記のように宣言した場合hogeは インスタンスになり、Hogeクラスのコンストラクタが呼ばれるようなのですが、 Hoge hoge; Hogeクラスのコンストラクタが下記のような引数を持つものしか定義されていなかった場合は どの様な振る舞いをするのでしょうか? Hoge(int num); Javaでは引数の有るコンストラクタしか宣言しなかった場合はデフォルトコンストラクタは 作られなかったと思うのですが、c++では引数のないデフォルトコンストラクタができてるのでしょうか? また、デフォルトコンストラクタが出来ていなかった場合、 Hoge hoge; というようにプリミティブ型のような変数宣言の仕方で引数有りのコンストラクタを呼ぶことは出来るのでしょうか?

  • PHP5 コンストラクタや初期化の意味がわからない

    プログラミング初心者です。本を参考にしてPHPを勉強しています。 クラスの章でコンストラクタについて以下のように書かれていました。 コンストラクタはインスタンス化のタイミングで実行されるという性質上、 プロパティ(メンバ変数)やクラスで使用する各種リソースの初期化 といった処理を記述するのが一般的です。 初期化処理が不要な場合、コンストラクタは省略可能。 ここで質問です。 インスタンス化を行うのは初期化するためということでしょうか? 「~といった処理を記述するのが一般的」ということは、初期化が 本来の目的ではないという意味にもとれますがどうなんでしょうか。 また静的メソッドについては、 「インスタンス化を行わなくても利用できるメソッド」 と書かれていましたが、何がどう違うのか分かりません。 初期化とは何でしょうか?またなぜ初期化を行うのでしょうか? 静的メソッドと何が違うのでしょうか?

    • ベストアンサー
    • PHP
  • STL vectorの初期化

    STL vectorの初期化についてなんですが 以下のようなクラスのprivateなメンバ変数としてvectorを定義し それをメソッド内のループ処理にて初期化しながら使用したいのですが 初期化の仕方が分かりません。コンストラクタを呼べば初期化されるようですが 以下のようにヘッダとソース内で2度同じような宣言をしてしまっても問題ないのでしょうか? //=== test.h === class test { private : vector<int> array; public : int fnc(); }; //=== test.c === int fnc() { for (int i = 0; i < 10; i++) { //★ここで初期化したい vector<int> array;  ←これで問題ないか? for (int j = 0; j < 10; j++) { array.push_back( md ); } } } C#などでは宣言とインスタンス生成を別に分けられたのですがC++も同様の事が出来るのでしょうか? 一応「array = new vector<int>;」といれて見たのですがエラーが出ました。

  • ご教示ください。

    ご教示ください。 javaで日付操作をやっています。 通常、クラスのインスタンスを作成する場合 クラス名 変数名 = new クラス名(); ですが、カレンダークラスを使用した際に Calender 変数名 = Calender.getInstance(); と出てきました。 Calenderクラスにある、getInstanceメソッドを呼び出していると思います。 クラスをインスタンスすることで、そのクラス内にある、メソッドやフィールドを初期値で使えて(コンストラクタがない場合)と認識しています。 インスタンスで、直接、メソッドを呼び出せる場合があるのでしょうか?

  • フィールド、インスタンス変数、プロパティ、…

    フィールド、インスタンス変数、プロパティ、… C++では、クラスの構成要素はメンバと呼ばれ、メンバには変数と関数と二種類あり、変数は、 (1)メンバ変数(オブジェクトがデータを保持するメンバである事を強調する為、別称データメンバ) 関数は、 (2)メンバ関数 と、とってもクリアに呼ばれていました。 ところがJavaになって、メンバ変数が (1’)フィールド メンバ関数が (2’)メソッド と呼ばれるようになりました。 さらに(1’)が、 (1’’)インスタンス変数 (1’’’)プロパティ という風にも呼ばれるようになり、(1')と(1'')と(1''')が、混同して呼ばれるようになりました。 多くの人は、 「それらは "interchangeable" で同じ意味で用いられるものなのだ」 という根拠がよくわからない『解説』をしますが、同じ意味ならば同じ用語を使った方が全体がスッキリ且つ正確に表現できて都合がいいのに、なんでいろいろな用語を混用するのでしょうか? (A)そもそも何でデータメンバをフィールドと言い換えたのか?  (a)データメンバの方が、それがデータであることを示唆していていいのでは?  (b)フィールドって、Cの構造体のフィールドから名前が由来しているのでしょうか? (A)何でわざわざ(1'')や(1''')みたいな用語を使うのか? (B)どういう意図でそういう用語を使うのか? そこら辺の事情に詳しい方がいらっしゃいましたら、お教えください。

    • ベストアンサー
    • Java