104 「static修羅道」 Step07 解答例


User.java

public class User {
  // クラス全体で共有する「次に割り当てるID」
  private static int nextId = 1;

  // このインスタンスに割り当てられたID(個別)
  private int id;

  // ユーザーの名前(個別)
  private String name;

  // コンストラクタ:Userを生成するたびにIDを自動で付ける
  public User(String name) {
    this.id = nextId;  // 今のnextIdを割り当て
    nextId++;          // 次のインスタンス用に+1しておく
    this.name = name;
  }

  // ユーザー情報を出力
  public void printInfo() {
    System.out.println("[ID: " + id + "] 名前: " + name);
  }
}

Main.java

public class Main {
  public static void main(String[] args) {
    User u1 = new User("Alice");
    User u2 = new User("Bob");
    User u3 = new User("Carol");

    u1.printInfo();
    u2.printInfo();
    u3.printInfo();
  }
}

実行結果

[ID: 1] 名前: Alice
[ID: 2] 名前: Bob
[ID: 3] 名前: Carol

解説

この問題では、インスタンスごとに一意なIDを自動付与する方法として
static 変数をカウンタとして使うテクニックを学びました。


staticな nextId とは?

private static int nextId = 1;
  • すべての User インスタンスで 共有されるカウンタ
  • 初期値を 1 にしておき、インスタンスが作られるたびに1つずつ増やす
  • id = nextId; nextId++; によって、一意なIDを順番に割り振ることができる

なぜ id は非staticなのか?

private int id;
  • idそのインスタンス専用の情報
  • static にしてしまうと、全インスタンスが同じ値を持ってしまう
  • 各インスタンスが 自分だけのID を持つためには、非staticである必要がある

現場でよく使われる設計

このような「ID連番割り振り」は、実際の開発現場でも非常によく使われます。

例:

  • ユーザーID
  • 注文番号
  • セッション番号

いずれも「一意な番号を自動でふる」ために static 変数を活用します。


まとめ

  • static 変数は インスタンス間で共有するカウンタとして使える
  • コンストラクタ内で id = nextId++ とすることで、一意なIDを割り当てられる
  • static と非static の「役割の違い」を、設計として使い分けることが重要

104 ステップアップ問題 「static修羅道」


Just Keep Typing, Baby!では、この「static修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

// tesh:
// 似た問題でまた詰まる未来、見えてるなら止めよう。