定数と初期化
定数への値の代入
Javaで 定数 を宣言するにはfinal修飾子を使う。
定数名はC言語から続く慣例として他の言語と同様、すべて大文字(とアンダースコア)で記述するのが習わしである。
以下は、文字列定数CONSTANT_STRINGを定義する例である。
リスト1
Javaの定数が他の言語の定数とちょっと異なるのは、宣言と同時に値を代入しなくてもよくて、1回だけ値を代入できる点である。
C#のconstではなく、readonlyに相当するようだ。(C#のconstとreadonlyについてはC#「定数と初期化 - 愚鈍人」を参照)
従って、次のようなコードは許される。
リスト2
staic定数とインスタンス定数
定数はメソッド内に宣言する事もできるが、クラスのメンバーとして宣言する事もできる。
staticな定数として宣言する事も,インスタンスメンバーとして宣言する事もできる。
定数の値がインスタンスごとに異なる場合はインスタンスメンバーとして宣言する必要があるが、通常、定数は異なるインスタンスでも同じ値を使うのでstaticとして宣言した方がメモリーの節約になるので良い。
必須ではないが、staic定数を宣言の後で代入する場合は、staicイニシャライザ内で,インスタンス定数の場合は、インスタンスイニシャライザもしくはコンストラクタ内でおこなう。
(イニシャライザについてはイニシャライザ(initializer) ― staticイニシャライザとインスタンスイニシャライザ - 愚鈍人を参照)以下に、staic定数とインスタンス定数の例を示す。
リスト3
このプログラムを実行した結果は、以下のようになる。
定数STATIC_CONSTANTにはプログラムを開始した時の日時が、CONSTANTにはインスタンスが生成された日時(インスタンスごとに値が異なる)が代入されている事がわかる。
定数配列
配列を定数として指定する事ができるが、期待した動作とはならない。
以下にその例を示す。
リスト4
配列定数に別の配列を代入しようとする(8行目のコメントをはずす)とエラーになる。
しかし、11行目のように配列定数の要素に値を代入する事は、定数なのにできてしまう。
配列に限らず 参照型 の値はデータそのものではなく、データの格納先(参照先)を示す値が入っている。
参照型を定数として指定すると参照先を変更する事はできなくなるが、参照先の値を変更する事までは禁止できない。
しかし、言語としてサポートしていなくても、工夫すれば、定数の配列...のようなものを作る事はできる。
以下にその例を示す。
リスト5
ConstansStringArrayクラスは、配列の要素を隠蔽するためのクラスである。
CONSTANT_ARRAY内の配列の要素は、getメソッドで取得できるが,要素の値は変更する事ができない。
このクラスの欠点は、配列の型がStringクラスに限定されてしまう事と、拡張for文が使えなくなってしまう事である。
そこで、コードは多少長くなるがGenerics型とイテレータを使って、もう少しこのクラスを拡張した例を示す。
リスト6