「static修羅道」StepFinal:全体の頂点を、個人の更新で塗り替えろ

0005_static修羅道-stepFinal learn

まずは問題を見ろ

javadrill.tech で出題された問題を見る(StepFinal)


問題のポイント

  • プレイヤー個人が持つスコア(インスタンス変数)
  • クラス全体で共有する最高スコア(static変数)
  • setScore() を呼ぶたびに、highScoreを更新するかを判定する処理
  • static と非static が対等に連携する設計を体験する回

まず、日本語で考えろ

  • プレイヤーはそれぞれのスコアを持つ(自分の得点)
  • highScore は「いままでの中で一番すごいやつ」
  • 誰かがその記録を超えたら、それが新しい highScore になる
  • この構造を static 変数とインスタンス変数で表現する

コメントを書け

// Player クラスを定義する
// name(名前)と score(現在のスコア)はインスタンス変数
// highScore はクラス全体で共有する static 変数
// setScore(int) メソッドで score を更新し、
//   newScore が highScore を超えていたら highScore も更新
// display() で名前・スコア・最高スコアを出力する

コメントに従って、コードを書け

public class Player {
  private String name;
  private int score;
  private static int highScore = 0;

  public Player(String name) {
    this.name = name;
    this.score = 0;
  }

  public void setScore(int newScore) {
    this.score = newScore;
    if (newScore > highScore) {
      highScore = newScore;
    }
  }

  public void display() {
    System.out.println(name + " のスコア: " + score + "(現在の最高スコア: " + highScore + ")");
  }
}
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)
  }
}

コードの解説

  • score はそのプレイヤー自身のスコア → インスタンス変数
  • highScore は誰が更新したかに関係なく、全体の記録 → static 変数
  • setScore() 内で if (newScore > highScore) により、条件付き更新が行われる
  • display() では両方の情報を出力することで、個人と全体の関係が明確に

つまづきやすいポイント

  • static 変数は 「誰か1人が更新すれば全体に反映される」
  • setScore() 内で highScore を更新しないと、記録が正しく残らない
  • static変数とインスタンス変数の区別が甘いと、バグにつながる(例:全員のスコアが同じになる など)

// tesh:
// 「個人が歴史を塗り替える。」
// それが、staticとの最終連携や。
// 
// オレ(インスタンス)が頑張った結果、
// 全体(クラス)の頂点が更新される。
// 
// それが setScore() における highScore の更新や。
// つまりこれは、「オレの成果が、歴史に刻まれる」ってことやで。
// 
// よく考えてみ。
// score は自分だけのもんや。だけど highScore は、誰が塗り替えたか関係ない。
// 記録が正しいかどうか、それだけが問題や。
// 
// この設計、すごいこと言うてるんよ。
// オレらは、自分の持ち場(インスタンス変数)で全力を尽くす。
// そして、それがクラス全体の成果(static変数)に反映される。
// 
// これができたら、設計者として一皮むけた証や。
// 
// static ってのは、全体のメモリ。
// インスタンスは、一人ひとりのプレイヤー。
// 
// クラスってのは、個と全体のダイナミズムをどう設計するかに尽きるんや。
// 
// 高みを目指すのは、個人の自由。
// でも、高みに到達した記録を、全体で共有することこそ、設計の妙味やで。
// 
// 「オレのスコアはオレのもの。でも、記録はみんなのもの。」
// 
// 言葉にすると簡単やけど、それをコードに落とし込むのがエンジニアの腕や。

static修羅道(ステップ一覧)へ戻る