- ベストアンサー
コンストラクタについて
コンストラクタにパラメータを指定するのは注意が必要という話を聞きました。 例) public Test(String str){ this.str_ = str; } なぜ注意すべきなのでしょうか? やはりパラメータを引数にとる時は以下のように書くのがよいのでしょうか? 例) public String test(String str){ ~ ~ プログラミングの先輩方、ぜひご教授ください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
「注意が必要」だけだと、なんとも返事がしにくい感じがします。「よくない」ということなのか、ただ単に「ここに注意しないといけない」ということなのか。 私自身は、コンストラクタにパラメータを指定することを否定的に耳にした記憶はありません。ですので、別に「しないほうがいい」ということではないと思います。 「注意すべき」ということで、ちょっと思いついたのは以下の2点です。 ・引数付きコンストラクタを定義した際、デフォルトコンストラクタの定義を忘れて、後で予想外のところで叱られる、ということが往々にしてあります。 ・デフォルトコンストラクタと引数付きコンストラクタを用意した場合、コンストラクタの呼び出し順はどうなるのか、考える必要があります。どのメソッド内でthis()して、どこでsuper()するか、きちんと設計しないといけません。よく、複数のコンストラクタをもったクラスで、すべてのコンストラクタで片っ端からsuperしてるのを見たりしますので。 他にもあるのかも知れませんが、今思い出さないので……。いずれも「注意しましょう」ということであって、「だから引数付きコンストラクタはよくない」というわけではありませんので、念のため。
その他の回答 (1)
- hitomura
- ベストアンサー率48% (325/664)
以下の例のように外部から値を書き換えられ、カプセル化が完全ではなくなるから、じぁないかと思います。 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()); } } というか、あなたが提示した下の例はコンストラクタではなくなっています。
お礼
なるほど! コードまで書いてくださいましてありがとうございます! ご回答ありがとうございます!
お礼
なるほど。 しない方がいいというわけではないのですね! とてもわかりやすい説明です! ご回答ありがとうございます。