コンストラクタ
new した直後は、まだ空っぽ
前のレッスンで new を覚えました。ただ、いまの書き方だと、作ったあとにフィールドを 1 つずつ埋める作業が残ります。
Java
Cat c = new Cat();
c.name = "タマ";
c.age = 3;本当にやりたいのは 1 行目だけなのに、3 行かかっています。しかも c.age = 3; を書き忘れても Java は何も言いません。int のフィールドは 0、String のフィールドは null という初期値のまま放置され、あとから null が混ざった文字列が出てきて、ようやく気づきます。猫が 10 匹に増えれば、この埋め忘れは 10 回ぶんの地雷になります。
値を渡してから作る
そこで、new のカッコの中に値を渡せるようにします。そのための書き方が コンストラクタ です。
Java
class Cat {
String name;
int age;
Cat(String n, int a) {
name = n;
age = a;
}
}
Cat c = new Cat("タマ", 3);Cat(String n, int a) の行がコンストラクタです。ふつうのメソッドと違うところは 2 つあります。
- 名前を クラス名とまったく同じ にする
- 戻り値の型を書かない。
voidも書かない
この 2 つが揃っているときだけ、Java はこれを「new されたときに動くもの」として扱います。new Cat("タマ", 3) と書いた瞬間に中の 2 行が走り、フィールドが埋まった状態の猫が返ってきます。もう埋め忘れようがありません。
public void Cat(String n, int a)のように戻り値の型を書いてしまうと、Java はこれをコンストラクタではなく「たまたまCatという名前のメソッド」として読みます。クラス定義の側はエラーにならず、離れた場所のnew Cat("タマ", 3)だけが赤くなるので、原因にたどり着きにくい間違いです。
引数ありを書くと、引数なしが消える
これまで new Cat() と書けていたのは、コンストラクタを 1 つも書いていないクラスに対して、Java が引数なしのものを黙って用意してくれていたからです。
自分でコンストラクタを 1 つでも書くと、この「黙って用意」は止まります。
Java
Cat c = new Cat();
// constructor Cat in class Cat cannot be applied to given typesさっきまで動いていた行が、Cat(String n, int a) を足しただけで赤くなります。引数なしも使いたいなら、そちらも自分で書き足してください。
やってみよう
右のエディタで bookFullTitle(String title, String author) を完成させます。本のタイトルと著者を受け取って、1 本の文字列にまとめて返すメソッドです。区切りに挟む文字は、前後の半角スペースまで課題の要件どおりに合わせてください。
まずはメソッドの中で直接組み立てて構いません。テストが緑になったら、Book クラスを自分で書いて、コンストラクタでタイトルと著者を受け取り、その値を使って文字列を組み立てるメソッドを足す ─ という形に書き換えてみてください。「作るときに値を渡す」という感覚は、書き換えたときにいちばんはっきり分かります。
要件
- クラス名は
Solution、メソッド名はbookFullTitle、引数はString titleとString authorの 2 つにすること - 戻り値の型は
Stringで、title + " by " + authorの形の文字列を返すこと titleとauthorの間に挟む文字列はby(前後に半角スペース 1 つずつ) を厳密に守ること
入出力例
bookFullTitle("Java入門", "著者A") → "Java入門 by 著者A"
bookFullTitle("Effective Java", "Bloch") → "Effective Java by Bloch"
bookFullTitle("リーダブルコード", "Boswell") → "リーダブルコード by Boswell"
bookFullTitle("A", "B") → "A by B"
bookFullTitle("", "著者") → " by 著者"