まずは問題を見ろ
→ javadrill.tech で出題された問題を見る(Step03)
問題のポイント
- static変数はすべてのインスタンスで共有される
- インスタンス変数はそれぞれのインスタンスごとに独立して存在する
- ふるまいの違いを出力結果で体感する
まず、日本語で考えろ
- Alice も Bob も、自分が何回送信したかを知りたい(→インスタンス変数)
- でも、全体で何回送信されたかも知りたい(→static変数)
- この2つは設計として目的が違う
- だから変数のスコープ(staticかどうか)も変わる
コメントを書け
// name(名前):各ユーザーが持つ
// messageCount:各ユーザーの送信回数(インスタンス変数)
// totalMessageCount:全体の送信回数(static変数)
// sendMessage() を呼ぶたびに、両方を1ずつ増やす
// "○○ の送信回数: x(全体: y)" を出力
コメントに従って、コードを書け
public class User {
private String name;
private int messageCount = 0; // 各ユーザーの送信回数
private static int totalMessageCount = 0; // 全体で共有する送信回数
public User(String name) {
this.name = name;
}
public void sendMessage() {
messageCount++; // 自分のカウント
totalMessageCount++; // 全体のカウント
System.out.println(name + " の送信回数: " + messageCount + "(全体: " + totalMessageCount + ")");
}
}
public class Main {
public static void main(String[] args) {
User u1 = new User("Alice");
User u2 = new User("Bob");
u1.sendMessage(); // → Alice: 1(全体: 1)
u2.sendMessage(); // → Bob: 1(全体: 2)
u1.sendMessage(); // → Alice: 2(全体: 3)
}
}
コードの解説
messageCount
はそれぞれのユーザー専用totalMessageCount
はすべてのユーザーで共有される- staticかどうかの違いは、**スコープ(共有されるかどうか)**に出る
- 出力の数字が、すべてを物語っている
つまづきやすいポイント
- 「全部staticにしとけばええやん」→ 全員で同じノートを使ってるようなもん。危険。
- 設計視点を持て:「これは個別の情報か?全体で1つでいいか?」
- staticは共有のための道具。個別情報には絶対使うな。
// tesh:
// static にすりゃ便利?──それ、地雷の始まりや。
//
// たとえば messageCount を static にしたらどうなるか?
// Alice が送ったメッセージ数を、Bob が引き継ぐ。
// Bob が送っても、Alice の回数が増える。
//
// つまり、「他人の数字が自分のものになる」。──バグ以前の、設計ミスや。
//
// static にするってことは、「この情報は全体で1つだけでいい」って言ってるのと同じ。
// 逆に、インスタンス変数は「それぞれの持ち物や」っていう意思表示や。
//
// 誰が持つべき情報か?
// それは一人に属するのか、みんなに共通なのか?
//
// この視点を忘れたままコードを書いてると、
// いつか “誰の責任かわからない” 状態に陥る。
//
// 設計ってのは、「どの情報を、どこに置くか」の勝負や。
// 変数1つにも、設計者の思想が出る。
//
// 今、オマエがコードに書いた1行が、
// 未来のオマエを助けるか、殺すか──
// それは、「staticでいいのか?」と向き合ったかどうかで決まるんや。
//
// 書く前に問え。
// 「この情報は、誰のもんや?」ってな。