定数 (static final)
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 18/87。
staticとfinalを組み合わせることで、定数(クラスに属し、決して変更できない値)が作成されます。これはJavaで定数を定義する標準的な方法です。
public class GameSettings {
public static final int MAX_PLAYERS = 4;
public static final double GRAVITY = 9.81;
public static final String GAME_TITLE = "Space Adventure";
}慣習として、定数名は通常の変数と区別するために UPPER_SNAKE_CASE を使用します。これらは static かつ final であるため、クラス名を通じてアクセスし、その値は決して変更されないことが保証されています。
System.out.println(GameSettings.MAX_PLAYERS); // 4
// GameSettings.MAX_PLAYERS = 8; // エラー!変更できません定数は通常、アプリケーション全体で共有されることを意図しているため、public と宣言されます。Math.PI のような値を考えてみてください。これは、どのコードからでも使用できる public static final な定数です。
なぜハードコードされた値の代わりに定数を使用するのでしょうか?コードの至る所に 4 と記述し、後でそれを 6 に変更する必要が生じた場合、すべての箇所を探して更新しなければなりません。MAX_PLAYERS のような定数を使用すれば、1か所を変更するだけで済みます。
定数を使うと、コードの可読性も高まります。謎の 4 よりも MAX_PLAYERS の方が分かりやすいでしょう。
チャレンジ
簡単重要な数学的数値を定数として保持する MathConstants ユーティリティと、それらの定数を使用して計算を行う CircleCalculator を作成しましょう。
コードを整理するために、2つのファイルを作成します:
MathConstants.java:public static finalフィールドを使用して数学定数を保持するクラスを作成します:PI値は3.14159E(ネイピア数) 値は2.71828GOLDEN_RATIO値は1.61803
Main.java: 定数を使用して円の計算を行います。入力として半径を受け取り、次の3行を出力します:- 円の面積:
Area: [value] - 円の周囲の長さ:
Circumference: [value] - 黄金比でスケーリングされた直径:
Golden Diameter: [value]
- 円の面積:
計算式は以下の通りです:
- Area = PI * radius * radius
- Circumference = 2 * PI * radius
- Golden Diameter = 2 * radius * GOLDEN_RATIO
入力として1つの値、半径 (double) を受け取ります。
すべての出力値は String.format("%.2f", value) を使用して、小数点以下2桁にフォーマットしてください。定数には MathConstants.PI のようにクラス名を通じてアクセスします。
チートシート
static と final を組み合わせることで、定数(クラスに属し、決して変更できない値)が作成されます。
public class GameSettings {
public static final int MAX_PLAYERS = 4;
public static final double GRAVITY = 9.81;
public static final String GAME_TITLE = "Space Adventure";
}慣習として、定数名には UPPER_SNAKE_CASE を使用します。定数にはクラス名を通じてアクセスします:
System.out.println(GameSettings.MAX_PLAYERS); // 4
// GameSettings.MAX_PLAYERS = 8; // エラー!変更できません定数は通常、アプリケーション全体で共有するために public として宣言されます。ハードコードされた値を意味のある名前に置き換えることで、コードの保守性と可読性が向上します。
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double radius = scanner.nextDouble();
// TODO: MathConstants.PI を使用して面積を計算してください
// 公式: PI * radius * radius
// TODO: MathConstants.PI を使用して円周を計算してください
// 公式: 2 * PI * radius
// TODO: MathConstants.GOLDEN_RATIO を使用して黄金直径を計算してください
// 公式: 2 * radius * GOLDEN_RATIO
// TODO: 結果を小数点以下2桁にフォーマットして出力してください
// フォーマットには String.format("%.2f", value) を使用してください
// 出力形式:
// Area: [value]
// Circumference: [value]
// Golden Diameter: [value]
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造