疲れたらやすむ

Javaを学ぶ上でハマったところを書いていきます。iPhoneアプリ開発や日常ネタもあるかも。

【Java】定数の定義と使用

今回は定数について。

どこかのプロジェクトに参画したら、必ずと言って良いほど目にする定数。
でも、私が参画したプロジェクトには未だ定数を定義しているものがありませんでした。
定数を使わずベタ書きで一旦はリリースを終え、機能追加を行う頃にはもはや全て定数に直すのは遠慮させて頂きたいレベル。

こういうのは気づいた時に直さないと、後々手がつけられなくなってしまいます。
直している暇があれば良いですが。
定数に直すだけでなくテストも必要になりますからね。意外と大変です。

定数とは

まず定数とは、一度代入したら後から変更出来ない値のことです。

対して、後から変更出来る値は変数と言います。
基本的にソースでどんどん宣言していくのは変数です。

ログに出す文字列はソースにベタ書きでも良いかもしれませんが、文字列の比較などに使用する際は定数で定義しておくのが良いと思います。
ベタ書きではスペルミスでバグを生む可能性もありますし、複数のファイルで同じ文字列を修正する場合はGrepして置換する面倒な作業が増えます。

定数は下記の様に記述します。

static final String STR_A = "A";

一般的なルールとしては、
・static finalで宣言する
・命名はは大文字と、区切りはアンダーバー
ぐらいでしょうか。

ちなみに、宣言時はアクセス修飾子(publicやprivate)を基本的に付けます。
その辺りは使用する状況に応じて。

あと、何気に忘れてしまいがちなのが各修飾子の順番。
アクセス修飾子も付けるなら

public static final String STR_A = "A";

となります。

アクセス修飾子 static修飾子 final修飾子」の順です。

クラス内で定数を宣言する方法

比較的使用する敷居は低いかと思います。

クラス内で定数を宣言し、そのクラスでのみ使用します。

Main.java

public class Main {

	private static final String STR_A = "A";
	private static final String SPACE = " ";

	public static void main(String[] args) {
		System.out.println(STR_A + SPACE + STR_A);
	}
}

実行結果

A A

メリットは他のクラスに影響を及ぼさないこと・・・ぐらいでしょうか。
逆に言えば、他のクラスで同じ定数を使いたくても使えないので、同じ定数を色んなクラスで使いまわしたい時はこの方法は避けた方が良いと思います。

既存のソースは定数を使っておらず、新規に改修する部分だけでも定数にしたい!という時はこの方法も選択肢の1つって感じですね。
ただ、それでも恒久対策とは言い難い気はします。
せっかく定数を使用するなら、定数クラスを使用する方が便利です。
コストと相談ですね。

定数クラスを用意する方法

多分一般的。
基本的にどのプロジェクトも定数クラスはあるはず。
ただ単にConstant.javaとかいう名前だったり、もう少し細かく◯◯Constant.javaだったり。
後者の方が、1つのファイルが肥大化しないので良いと思います。
逆に前者の様な名前だと、何でもかんでもそのファイルに定数を定義してしまい、何の定数が定義されているのか分かりづらいですし見るのも大変です。

使用例はこんな感じです。

FruitsConstant.java

public class FruitsConstant {

	public static final String APPLE = "リンゴ";
	public static final String ORANGE = "オレンジ";
}

Main.java

public class Main {
	public static void main(String[] args) {
		System.out.println(FruitsConstant.APPLE + "と" + FruitsConstant.ORANGE + "を買います。");
	}
}

実行結果

リンゴとオレンジを買います。

定数クラスに定義している定数を変更すれば、すべての呼び出し元に影響があります。
これはメリットでもあり、場合によってはデメリットと言うか、気をつけなければならない部分ですね。
こっちのクラスでは変更したかったけど、違うクラスではそのままの定数を使いたかった!みたいなことは避けたいです。

Enumを使用する方法

以前書いたこちらの記事にまとめてあります。

www.chibicat.net

ざっくり説明すると、Enumは複数の定数をまとめておくことが出来る列挙型と言うものです。
定数クラスの代わりにEnumを使用するイメージですね。

紐付けておきたい定数同士がある場合に使用するのが良いかと思います。
DBに格納されている複合キーの値とか。


今回は以上になります。