Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで定数を定義するならfinalキーワードだけでは不十分!staticとの組み合わせが必要な理由


Javaにおける定数とは

定数とは、一度値を設定するとプログラムのどこでも変更できない変数のことです。さらに、定数はプログラム内にただ1つのコピーだけが存在するという特徴も持ちます。宣言時に値を代入した後は、以降の処理でその値を書き換えることは一切できません。

staticとfinalを組み合わせて定数を作る

他の多くの言語と違い、Javaには定数を直接宣言するための専用構文がありません。しかし、変数をstaticかつfinalとして宣言すれば、定数と同じ働きを持たせることができます。

  • static ― staticを付けた変数は、クラスがメモリにロードされるタイミングで一度だけ生成されます。そのため、インスタンスをどれだけ作成しても、変数のコピーは常に1つだけです。
  • final ― finalを付けた変数は、初期化後に値を再度変更することができません。

この2つの修飾子を組み合わせれば、「値が固定されており、プログラム全体で1つのコピーしか存在しない」という定数の条件を満たすことができるのです。

コード例

class Data {
   static final int integerConstant = 20;
}
public class ConstantsExample {
   public static void main(String args[]) {
      System.out.println("value of integerConstant: "+Data.integerConstant);
   }
}

実行結果

value of integerConstant: 20

static finalで宣言された変数は、インスタンスを生成しなくても「クラス名.変数名」の形式で直接アクセスできる点もポイントです。

finalだけでは本当の定数にならない

では、staticを付けずにfinalだけを指定した場合はどうなるのでしょうか。この場合、変数の値そのものは確かに変更できませんが、newでオブジェクトを生成するたびに、その変数のコピーが新しく作られてしまいます

コード例

class Data {
   final int integerConstant = 20;
}
public class ConstantExample {
   public static void main(String args[]) {
      Data obj1 = new Data();
      System.out.println("value of integerConstant: "+obj1.integerConstant);
      Data obj2 = new Data();
      System.out.println("value of integerConstant: "+obj2.integerConstant);
   }
}

実行結果

value of integerConstant: 20
value of integerConstant: 20

この例では、final変数の値を2つの異なるオブジェクトから表示しています。出力される値はどちらも同じですが、それぞれ別々のオブジェクトに属する独立したコピーである点に注意してください。オブジェクトの数が増えれば、それに応じて変数のコピーも増えていきます。

定数の定義に従えば、変数はプログラム(クラス)全体を通じてたった1つのコピーでなければなりません。そのため、定義どおりの本物の定数を作りたいのであれば、変数は必ずstaticとfinalの両方を付けて宣言する必要があるのです。

  1. Javaのfinal変数とは?使い方と定数宣言の基本を解説

    Javaにおけるfinal変数は、明示的な初期化を一度しか行えない変数です。一度値を代入すると、その後は再代入することができません。 また、参照型変数にfinalを付けた場合、その参照先のオブジェクトを別のオブジェクトに変更することはできません。ただし、オブジェクト内部のデータ(フィールドの値など)は変更可能です。つまり、オブジェクトの状態は変更できるが、参照自体は変更できないという点に注意が必要です。 final修飾子とstaticの組み合わせ 変数に対してfinal修飾子を使用する場合、多くの場面でstaticキーワードと組み合わせて使われます。これにより、定数がクラス変数(クラス全体で共

  2. Javaのfinalキーワードとは?変数・メソッド・クラスでの使い方を解説

    finalは、Javaにおける非アクセス修飾子のひとつです。クラス、メソッド、変数の実装を「確定」させるために使用され、これらが後から変更されることを防ぐ役割を持ちます。本記事では、finalキーワードの基本的な概念と、変数・メソッド・クラスそれぞれでの使い方をコード例とともに解説します。final変数final変数は、明示的に初期化できるのは一度だけです。また、finalで宣言された参照変数は、別のオブジェクトを参照するように再代入することはできません。ただし、オブジェクト内部のデータ自体は変更可能です。つまり、オブジェクトの「状態」は変えられるものの、「参照先」は変えられないという点に注意