「static修羅道」Step09:個別の状態と全体の状態を分けて記録せよ

0005_static修羅道-step09 learn

まずは問題を見ろ

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)
  }
}

コードの解説

  • titlepages はインスタンス変数 → 各書類が個別に持っている情報
  • totalPages は static → 全書類のページ数をまとめて保持
  • コンストラクタ の中で totalPages += pages することで、作られた時点でそのページ数を集計

つまづきやすいポイント

  • static にしたら全インスタンスに1個だけ → 個別の情報には向かない
  • static の値はインスタンス生成順によって変化することがある
    状態を共有するという意味を、実感しておくことが大事
  • 表示のたびに totalPages が増えたりしないよう、加算の場所はコンストラクタに限定

// tesh:
// 「オレはオレ」、「オレたちはオレたち」──データにも、それぞれの立場があるんや。
// 
// title や pages は、その書類が何者かっていう「個体の話」。
// totalPages は、クラス全体が持つ「世界の話」。
// 
// ここをごっちゃにしてるヤツが多い。
// 「全部staticにしたら便利やん」って? ──違う違う。
// static にするってのは、「これは全体に属する情報です」って宣言することや。
// 
// クラスってのは、言うなれば部族や。
// その中のインスタンスは、個人や。
// 
// 「このデータは、部族で共有される記録か?」
// 「それとも、個人だけが知ってる情報か?」
// 
// staticと非staticを分けるってのは、その線引きを、設計で決める行為なんやで。
// 
// よく聞け。クラスの設計ってのは、構文の話ちゃう。
// 「誰が、何を、どこに持ってるべきか」って問いへの答えや。
// 
// totalPages を見て「なんでこの値がこうなるんや…」って迷ったら、
// それは設計の線引きが甘い証拠や。
// 
// 1つずつ自分で作ったオブジェクトたちが、確かに1人ずつ存在してて、
// それらが積み上げてく歴史が、クラスに残っていく。
// 
// それが、static の真骨頂やろ。

static修羅道(ステップ一覧)へ戻る