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
の「役割の違い」を、設計として使い分けることが重要
Just Keep Typing, Baby!では、この「static修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!
// tesh:
// 似た問題でまた詰まる未来、見えてるなら止めよう。