まずは問題を見ろ
→ javadrill.tech で出題された問題を見る(Step09)
問題のポイント
static
はクラス全体で1つだけ → 全体の合計などに使うインスタンス変数
は1つ1つのオブジェクトが持つ → 個別のデータに使う- この問題では、両方の使い分けを体験することが目的
まず、日本語で考えろ
- 「書類」はそれぞれページ数が違う
→ これはインスタンスごとの情報(例:書類Aは5ページ) - でも「全体のページ合計」は共通で管理すればいい
→ これは全インスタンスで共有すべき情報(static) - つまり、「個別データ」と「全体データ」を役割で分けて変数を設計するという話
コメントを書け
// Document クラスを作成する
// インスタンス変数:title と pages を定義(書類ごとの情報)
// static 変数:totalPages を定義(クラス全体のページ合計)
// コンストラクタで title, pages を初期化し、totalPages に加算する
// printInfo() で 各書類のページ数と合計ページ数を出力する
コメントに従って、コードを書け
public class Document {
private String title;
private int pages;
private static int totalPages = 0;
public Document(String title, int pages) {
this.title = title;
this.pages = pages;
totalPages += pages;
}
public void printInfo() {
System.out.println(title + ": " + pages + "ページ(現在の合計: " + totalPages + ")");
}
}
public class Main {
public static void main(String[] args) {
Document d1 = new Document("書類A", 5);
Document d2 = new Document("書類B", 3);
Document d3 = new Document("書類C", 7);
d1.printInfo(); // 書類A: 5ページ(現在の合計: 5)
d2.printInfo(); // 書類B: 3ページ(現在の合計: 8)
d3.printInfo(); // 書類C: 7ページ(現在の合計: 15)
}
}
コードの解説
title
とpages
はインスタンス変数 → 各書類が個別に持っている情報totalPages
は static → 全書類のページ数をまとめて保持コンストラクタ
の中でtotalPages += pages
することで、作られた時点でそのページ数を集計
つまづきやすいポイント
static
にしたら全インスタンスに1個だけ → 個別の情報には向かないstatic
の値はインスタンス生成順によって変化することがある
→ 状態を共有するという意味を、実感しておくことが大事- 表示のたびに totalPages が増えたりしないよう、加算の場所はコンストラクタに限定
// tesh:
// 「オレはオレ」、「オレたちはオレたち」──データにも、それぞれの立場があるんや。
//
// title や pages は、その書類が何者かっていう「個体の話」。
// totalPages は、クラス全体が持つ「世界の話」。
//
// ここをごっちゃにしてるヤツが多い。
// 「全部staticにしたら便利やん」って? ──違う違う。
// static にするってのは、「これは全体に属する情報です」って宣言することや。
//
// クラスってのは、言うなれば部族や。
// その中のインスタンスは、個人や。
//
// 「このデータは、部族で共有される記録か?」
// 「それとも、個人だけが知ってる情報か?」
//
// staticと非staticを分けるってのは、その線引きを、設計で決める行為なんやで。
//
// よく聞け。クラスの設計ってのは、構文の話ちゃう。
// 「誰が、何を、どこに持ってるべきか」って問いへの答えや。
//
// totalPages を見て「なんでこの値がこうなるんや…」って迷ったら、
// それは設計の線引きが甘い証拠や。
//
// 1つずつ自分で作ったオブジェクトたちが、確かに1人ずつ存在してて、
// それらが積み上げてく歴史が、クラスに残っていく。
//
// それが、static の真骨頂やろ。