「static修羅道」Step04:定数保持クラスを作れ(public static final)

0005_static修羅道-step04 learn

まずは問題を見ろ

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


問題のポイント

  • 定数は public static final で定義する
  • クラスから直接呼び出せる(newしない)
  • 値が変わらないことを コードの形で保証する
  • 定数に「名前」を与えることで、設計意図が読みやすくなる

まず、日本語で考えろ

  • サービス名、税率、ログイン上限回数──毎回書くんじゃなく、ひとまとめに管理したい
  • 書き換えられると困る → final
  • どこでも使えるようにしたい → public static
  • そうやってできた「定数クラス」は、設計上の共有辞書

コメントを書け

// AppConstants クラスを定義
// public static final で定数を定義する
// サービス名、税率、ログイン上限を定義
// new できないように private コンストラクタを用意

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

public class AppConstants {
  public static final String SERVICE_NAME = "MyApp";
  public static final double TAX_RATE = 0.1;
  public static final int MAX_LOGIN_ATTEMPTS = 3;

  private AppConstants() {
    // インスタンス化禁止
  }
}
public class Main {
  public static void main(String[] args) {
    System.out.println("サービス名: " + AppConstants.SERVICE_NAME);
    System.out.println("税率: " + AppConstants.TAX_RATE);
    System.out.println("最大ログイン試行回数: " + AppConstants.MAX_LOGIN_ATTEMPTS);
  }
}

コードの解説

  • public static final の3セットは、定数の王道スタイル
  • final → 一度しか代入できない
  • static → クラスに属しているから、インスタンスを作らなくても使える
  • public → 他のクラスからアクセスできるように

つまづきやすいポイント

  • final を忘れると「定数」にならない
  • static がないと newしないと使えなくなって意味がない
  • AppConstants を間違って new しないように、コンストラクタをprivateにするのが慣習

// tesh:
// 「定数なんて、ただの固定値やろ?」──そう思ってるヤツは、設計の入口にも立ってねぇ。
// 
// オレたちが public static final で定数を書くのは、「書き換えるな」「共通で使え」「設計として固定だ」っていう、コードに込めたメッセージや。
// 
// MAX_LOGIN_ATTEMPTS = 3 をただの数字として書くか、名前つきの定数にするかで、
// オマエのコードは「考えなし」か「設計された」かに分かれる。
// 
// たとえば税率。もしソースのあちこちに 0.1 って数字が散らばってたら?
// 変えるとき全部手作業。どれが税率で、どれが割引率かもわからん。──それ、もう地獄や。
// 
// 定数は「この数字には意味がある」っていう 名前づけの意思や。
// 意味ある値に名前を与え、それをみんなが使う。
// コードの中に共通語を作ることが、プロジェクト全体の設計になる。
// 
// そして final。これはただの「変更禁止」じゃない。
// 「この値は、絶対に、変わらない」という保証であり、設計上の約束や。
// 
// 書き換えられたら困る情報を、誰も書き換えられないようにする。
// それが設計の責任であり、強さや。
// 
// コードは、数字や記号の集まりじゃない。意図と設計の記録や。
// だからオレたちは、public static final に魂を込める。

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