クラスにメソッドを定義する
フィールドを持たせたおかげで、チケット 1 枚の情報は 1 つの変数にまとまりました。ところが表示するたびに t.seat + " " + t.price + "円" と組み立て直しています。一覧に 1 か所、詳細に 1 か所、レシートに 1 か所と同じ式が散らばり、末尾を「円」から「JPY」に変えたい日には、3 か所を探して回ることになります。
組み立て方を、持ち主の側に置く
その式は Ticket 自身がいちばんよく知っているはずです。クラスの中にメソッドとして書いてしまいましょう。
Java
public class Ticket {
public String seat;
public int price;
public String label() {
return seat + " " + price + "円";
}
}書き方はこれまでのメソッドとほとんど同じですが、static が付いていません。そしてもう 1 つ、引数を 1 つも受け取っていないのに seat と price を使えています。
自分のクラスのフィールドは、引数で渡さなくても名前だけで読めます。label() の中の seat は、このメソッドを呼ばれた実体の seat です。
呼ぶときは、クラスではなく実体から
static の有無で、呼び出し方が変わります。
Java
Ticket t = new Ticket();
t.seat = "A-12";
t.price = 4800;
System.out.println(t.label()); // A-12 4800円Ticket.label() とは書けません。label() が使う seat は実体ごとに違うので、どの実体の話なのかを言わずには呼べないからです。static の付いたメソッドはクラスに属していて、実体が無くても呼べました。ちょうど対になっています。
ここを取り違えると non-static variable seat cannot be referenced from a static context というエラーに出会います。フィールドを使うメソッドに static を付けてしまったときの定番です。
同じメソッドでも、実体が違えば答えが違う
メソッドを実体に紐づけると何が嬉しいのか、2 枚並べると分かります。
Java
Ticket a = new Ticket();
a.seat = "A-12";
a.price = 4800;
Ticket b = new Ticket();
b.seat = "B-3";
b.price = 3200;
System.out.println(a.label()); // A-12 4800円
System.out.println(b.label()); // B-3 3200円呼んでいるのは同じ label() です。それでも答えが違うのは、使っているフィールドが別の実体のものだからです。データと、そのデータの扱い方が同じ場所にある。これがクラスにメソッドを書く一番の理由です。
やってみよう
bookDescription(String title, String author) は、Book の実体を作り、そのメソッド describe() を呼んで説明文を返します。
BookにはStringのフィールドを 2 つ持たせ、前回のやり方でそれぞれに値を入れますdescribe()にstaticは付けません。フィールドは名前だけで使えます- つなぐ位置に半角スペースが要ります。返す文字列の形は課題の要件をそのまま読んでください
- 引数をその場で組み立てて返してもテストは通りますが、それでは
Bookが 1 度も仕事をしていません。必ず実体のメソッドを経由してください
要件
Bookクラスのインスタンスメソッドdescribe()を実装することbookDescriptionの中でnew Book(title, author).describe()のようにインスタンスメソッドを呼ぶこと (固定文字列の即時 return は不可)describe()は"<title> by <author>"の形 (半角スペース付き) の文字列を返すこと
入出力例
bookDescription("Java 入門", "著者A") → "Java 入門 by 著者A"
bookDescription("Effective Java", "Joshua") → "Effective Java by Joshua"
bookDescription("確認", "チーム") → "確認 by チーム"