Player.java
public class Player {
// インスタンス変数:プレイヤーの名前
private String name;
// インスタンス変数:プレイヤーのスコア
private int score;
// クラス変数:全プレイヤーに共通の最高スコア
private static int highScore = 0;
// コンストラクタ:名前を初期化、スコアは0のまま
public Player(String name) {
this.name = name;
this.score = 0;
}
// スコアを更新し、必要に応じて highScore も更新する
public void setScore(int newScore) {
this.score = newScore;
// 最高スコアを上回っていれば更新
if (newScore > highScore) {
highScore = newScore;
}
}
// プレイヤーのスコア情報を出力
public void display() {
System.out.println(name + " のスコア: " + score + "(現在の最高スコア: " + highScore + ")");
}
}
Main.java
public class Main {
public static void main(String[] args) {
Player p1 = new Player("Alice");
Player p2 = new Player("Bob");
p1.setScore(50);
p1.display(); // Alice のスコア: 50(現在の最高スコア: 50)
p2.setScore(80);
p2.display(); // Bob のスコア: 80(現在の最高スコア: 80)
p1.setScore(100);
p1.display(); // Alice のスコア: 100(現在の最高スコア: 100)
}
}
実行結果
Alice のスコア: 50(現在の最高スコア: 50)
Bob のスコア: 80(現在の最高スコア: 80)
Alice のスコア: 100(現在の最高スコア: 100)
解説
この最終ステップでは、「staticと非staticの設計的な使い分け」を統合的に理解します。
score
はインスタンス変数(非static)
- 各プレイヤーが 自分専用のスコア を持っている
- だから
private int score;
は非static p1
のスコアとp2
のスコアは完全に独立して存在する
highScore
はstatic変数(クラス全体で共有)
- 「最高スコア」はゲーム全体で1つだけ存在すればいい
- どのプレイヤーがスコアを更新しても、条件に応じて
highScore
に反映される
setScore()
のロジックに設計の意図を込める
if (newScore > highScore) {
highScore = newScore;
}
- この一行が、「全体で共有される記録を管理する」という static の意味と責任を表している
static
を使うことによって、「設計でコードに意図を刻む」ことができる
まとめ
- インスタンスごとの情報(
name
,score
)は非staticで持つべき - 全体で1つしか存在しない情報(
highScore
)はstaticで持つべき static
を使うかどうかは「値を共有すべきかどうか」で判断する- 設計意図をコードに刻む──それがstatic修羅道のゴール
Just Keep Typing, Baby!では、この「static修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!
// tesh:
// 大丈夫。書いたオレも昔つまずいた。だから残してある。