まずは問題を見ろ
→ 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 に魂を込める。