まずは問題を見ろ
→ 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();
}
}
コードの解説
idCounter
はstatic
→ 全インスタンスで共有される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にするかどうか」は、“状態”の問題じゃない。時間の問題や。
// 覚えとけ。