「static修羅道」Step07:インスタンス生成とともにIDを連番で振れ

0005_static修羅道-step07 learn

まずは問題を見ろ

javadrill.tech で出題された問題を見る(Step07)


問題のポイント

  • static変数は全体で共有されるカウンタとして使える
  • インスタンスが生成されるたびに、自動で一意なIDを振ることができる
  • 状態を持たないstatic、状態を持つインスタンス、その連携

まず、日本語で考えろ

  • 新しくアカウントを作るたびに、IDを1つずつ増やして付けたい
  • でもそのカウント値は、すべてのインスタンスで共有されてる必要がある
  • 「個別の情報(name)」と「全体で進む情報(idカウンタ)」は分けて考えるべき
  • だから static を使う

コメントを書け

// User クラスを定義
// staticなidCounterを使って、インスタンスごとに一意のIDを割り振る
// name(名前)とid(固定ID)を持つ
// getInfo() で "ID: x, 名前: y" を出力

コメントに従って、コードを書け

public class User {
  private static int idCounter = 1; // IDを生成するための共有カウンタ

  private int id;    // 各ユーザーのID(固定)
  private String name;

  public User(String name) {
    this.name = name;
    this.id = idCounter++; // 1つ作るたびにカウントを進める
  }

  public void getInfo() {
    System.out.println("ID: " + id + ", 名前: " + name);
  }
}
public class Main {
  public static void main(String[] args) {
    User u1 = new User("Alice");
    User u2 = new User("Bob");
    User u3 = new User("Charlie");

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

コードの解説

  • idCounterstatic全インスタンスで共有される1本のカウンタ
  • User を new するたびに id に値が入り、その後 idCounter++ で次に進む
  • id 自体はインスタンス固有 → static じゃない
  • static は「インスタンスをまたいで進む流れ(連番)」にだけ使う

つまづきやすいポイント

  • id まで static にしてしまう → 全員同じIDになって意味がない
  • idCounter++ の位置を間違えると、IDが重複したりズレたりする
  • static を「変数が共有される」以外の目的(便利そうだから)で使うと、必ず事故る

// tesh:
// static を「みんなで共有する変数」やと思ってるうちは、ただの初心者や。
// 本質はな、“時間の流れ”をコードに刻むための道具”なんや。
// 
// ユーザーを new するたびに、自動でIDを割り振る。
// しかもズレも重複もなく、ちゃんと「お前は何番目のユーザーや」って言い切れる。
// それを支えてるのが static な idCounter や。
// 
// このカウンタ、まさに 「時代の記録係」 や。
// クラスが使われ続ける限り、一歩ずつ時を刻み続ける。
// 
// 逆に言えば、id まで static にしちゃうと「全員が1つのIDを持つ」ことになる。
// 名前は違うのに、みんなが「ID: 4」みたいな。──そんなもん、バグでしかない。
// 
// static が意味を持つのは、**変化の方向が「横」じゃなく「縦」**やからや。
// インスタンスをまたいで流れる、時間の縦軸。
// 
// これが static のもう一つの使い道、「履歴と進行の管理」や。
// 
// お前が設計するそのクラス、ちゃんと「時間軸」を意識してるか?
// その情報、本当にインスタンスごとに分かれてるべきか?
// それとも、全体の流れの中にあるのか?
// 
// 「staticにするかどうか」は、“状態”の問題じゃない。時間の問題や。
// 覚えとけ。

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