初めて自分の家と他人の家が違う、と意識した時

コンストラクタにパラメータを指定するのは注意が必要という話を聞きました。

例)
public Test(String str){
this.str_ = str;
}

なぜ注意すべきなのでしょうか?

やはりパラメータを引数にとる時は以下のように書くのがよいのでしょうか?

例)
public String test(String str){
~ ~

プログラミングの先輩方、ぜひご教授ください。

A 回答 (2件)

「注意が必要」だけだと、なんとも返事がしにくい感じがします。

「よくない」ということなのか、ただ単に「ここに注意しないといけない」ということなのか。

私自身は、コンストラクタにパラメータを指定することを否定的に耳にした記憶はありません。ですので、別に「しないほうがいい」ということではないと思います。

「注意すべき」ということで、ちょっと思いついたのは以下の2点です。

・引数付きコンストラクタを定義した際、デフォルトコンストラクタの定義を忘れて、後で予想外のところで叱られる、ということが往々にしてあります。

・デフォルトコンストラクタと引数付きコンストラクタを用意した場合、コンストラクタの呼び出し順はどうなるのか、考える必要があります。どのメソッド内でthis()して、どこでsuper()するか、きちんと設計しないといけません。よく、複数のコンストラクタをもったクラスで、すべてのコンストラクタで片っ端からsuperしてるのを見たりしますので。

他にもあるのかも知れませんが、今思い出さないので……。いずれも「注意しましょう」ということであって、「だから引数付きコンストラクタはよくない」というわけではありませんので、念のため。
    • good
    • 0
この回答へのお礼

なるほど。
しない方がいいというわけではないのですね!

とてもわかりやすい説明です!
ご回答ありがとうございます。

お礼日時:2014/04/29 11:23

以下の例のように外部から値を書き換えられ、カプセル化が完全ではなくなるから、じぁないかと思います。


class Bust {
private int value;
public void setValue(int aValue) { value = aValue; }
public int getValue() { return value; }
}

class Chihaya {
private final Bust bust;
public Chihaya(final Bust b) { bust = b; }
public Bust getBust() { return bust; }
}

public class TestBad {
public static void main(String[] args) {
Bust b = new Bust();
b.setValue(91);

Chihaya c = new Chihaya(b);

System.out.println("value of Chihaya's Bust : " + c.getBust().getValue());
b.setValue(72);

System.out.println("value of Chihaya's Bust : " + c.getBust().getValue());
}
}

というか、あなたが提示した下の例はコンストラクタではなくなっています。
    • good
    • 0
この回答へのお礼

なるほど!
コードまで書いてくださいましてありがとうございます!

ご回答ありがとうございます!

お礼日時:2014/04/29 11:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!