【Java入門】static final修飾子でクラス定数を使う方法まとめ

Javaには変数の値を自由に変更できないように「static final」を使用することがあります。

この記事では、static finalの、

  • final修飾子の意味
  • final修飾子の基本的な使い方
  • クラスにfinalを指定する方法
  • メソッドにfinalを指定する方法
  • クラス定数の初期化
  • 配列にfinalを指定する方法
  • ListやMapにfinalを指定する方法

という基本的な内容から、などの応用的な使い方に関しても解説していきます。

今回はそんなstatic finalの処理について、さまざまな方法をわかりやすく解説します!

final修飾子とは

変数は基本的に値を自由に変更できますが、一度値を設定したら変更されない変数のことを「定数」と呼びます。final修飾子を指定した変数は、基本的に規定値など一度値を設定したら変更する必要がない値に用いられます。

以下はfinal修飾子を指定して、クラス定数を宣言しています。クラス定数を指定する場合は、変数の宣言の頭にstatic finalを記述します。

final修飾子は変数以外にもメソッドやクラスにも指定することができます。

変数、メソッド、クラスにfinal修飾子を指定した場合は以下のようになります。

  • クラスにfinalを指定した場合は、そのクラスを継承することはできません。
  • メソッドにfinalを指定した場合は、そのメソッドをオーバーライドすることはできません。
  • 変数にfinalを指定した場合は、その変数の値を変更することはできません。

また、final修飾子を指定した定数は、通常の変数と区別するために変数名の英数字を大文字で記述することが多いです。

final修飾子の基本的な使い方

以下にfinal修飾子を使用した基本的な使い方を記述します。

サンプルでは、クラスの直下にstatic finalでdouble型のクラス定数を宣言しています。mainメソッドで、クラス定数の値が正しく設定されていることを確認できます。

また、定数は先述したとおり一度値を設定したら再度設定することはできませんのでメソッド内で以下のように定数を設定してもコンパイルエラーとなります。

クラスにfinalを指定する方法

以下にfinal修飾子をクラスに指定した場合のサンプルを記述します。

前述したとおり、クラスにfinal修飾子を指定すると、そのクラスは継承できなくなります。

このサンプルでは親クラスにあたるParentClassをfinal修飾子で指定しているため、その子クラスであるSubClassで、extendsによる親クラスの継承を指定しても、以下のエラーとなります。

メソッドにfinalを指定する方法

以下にfinal修飾子をメソッドに指定した場合のサンプルを記述します。前述したとおりメソッドにfinal修飾子を指定すると、そのメソッドはオーバライドできなくなります。

このサンプルでは親クラスにあたるParentClassのメソッドをfinal修飾子で指定しているため、その子クラスであるSubClassで、親クラスのメソッドを指定しても、以下のエラーとなります。

クラス定数の初期化

定数は基本的に宣言時に値を設定し、一度値を代入したら再設定はできません。そのため、宣言時に値を設定しなかった場合、メソッド内で初めて値を設定しようとしてもコンパイルエラーが発生します。

定数の数が多く、宣言と初期化処理を分けたい場合は、staticイニシャライザ内なら定数を初期化することが可能です。以下に定数の宣言と、定数の初期化処理を分けて記載するためのサンプルを記述します。

配列にfinalを指定する方法

final修飾子は、配列にも指定することができます。しかし、配列をfinalで宣言しても変更できないのは配列のインスタンスであり、配列の要素を変更することは可能です。

実行結果からわかるように、final修飾子で配列を宣言しても要素自体は変更できてしまいます。そのため、保持している要素を変えられたくない場合は、ListやMapなどの動的配列を使用する方法があります。

ListやMapをfinal修飾子を指定した定数として扱う方法は、次項で詳しく解説します。

ListやMapにfinalを指定する方法

定数は基本的に一度値を設定したら変更できませんが、ListやMapなどの動的配列をstatic finalで指定しても、値の変更ができてしまいます。

もし、ListやMapなどをfinal修飾子を指定した定数として扱いたいのなら、CollectionsクラスのunmodifiableListメソッドを使用する方法があります。

unmodifiableListメソッドは、ListやMapを読み取り専用とする機能で、設定したListやMapに値の変更や追加などを実施すると、UnsupportedOperationExceptionの例外が発生します。

そのため、unmodifiableListメソッドを使用すれば、定数として使用できることが可能となります。

以下にunmodifiableListメソッドを使用した、定数化の方法を記述します。

finalについてもっと詳しく知りたい方へ

この記事で解説したようにfinal修飾子を指定すれば、その変数やクラス、メソッドの内容を自由に変更することができなくなります。そのため、不用意に値やクラス、メソッドの内容を変えられたくない場合はfinal修飾子を指定するのが望ましいと言えます。

finalのさまざまな使い方については、以下の記事にまとめていますので、「final修飾子についてもっと知りたい!」という方はぜひ参考にしてくださいね!

static修飾子の使い方について

この記事で紹介したstatic修飾子は。主にクラスをインスタンス化せずに、直接メソッドや変数にアクセスできる便利な修飾子です。そんなstatic修飾子を活用する方法については、以下の記事で詳細に解説していますので、気になった方はぜひ参考にしてください!

【Java入門】static修飾子の使い方総まとめ
更新日 : 2017年6月9日

まとめ

ここでは、static finalの意味や基本的な使い方、初期化の方法やList、Mapの定数化などを説明しました。

final修飾子は、変更する予定のない規定値などを設定する場合に、変数と区別するために定数としてよく使用されます。もしstatic finalの記述方法を忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

ヤマシタ

エンジニア歴10年のフリーランスエンジニア。ITに関わるさまざまなコンテンツの企画・制作も行っています。
ITに関してはノウハウ系、ライフハック系、トレンド系など、200本以上の執筆経験があります。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説