104 「static修羅道」 StepFinal 解答例


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修羅道のゴール

104 ステップアップ問題 「static修羅道」


Just Keep Typing, Baby!では、この「static修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

// tesh:
// 大丈夫。書いたオレも昔つまずいた。だから残してある。