static final
日本語 | 静的最終 |
英語 | static final |
ふりがな | すたてぃっくふぁいなる |
フリガナ | スタティックファイナル |
staticとfinalのふたつの予約語で修飾されたフィールド。
フィールドに「static final 型 フィールド名 = 初期値;」の形式で使用する。
このstatic finalフィールドは、staticフィールドのため自クラスのインスタンスを作らずに使用できる。加えて、final変数のため値が変更できない。
以上の特性のため、定数を宣言する場合に使用される。
static finalフィールドは、リテラルの代わりとしてよく使用される。
プログラム上に直接書かれたリテラルは、修正が難しく可読性が下がる。
たとえば「System.out.println( 20 );」と書かれている場合に、この「20」という値の意味が一見分からない。また、プログラム上に複数の「20」がある場合、それぞれの値が同じ意味を持つのか、それとも別の意味の「20」なのかが判別できない。
そのため、この「20」という定数を含むプログラムが読み解きにくくなったり、この値を変更する際に注意が必要となってしまう。
そのため、リテラルはstatic finalフィールドとして宣言し、それを利用することが推奨される。
そうすることで、フィールドの名前から定数の意味が分かるため、可読性が上がる。また、定数値の変更はフィールド宣言の一箇所行えば済むため、修正が容易になる。
通常、static finalフィールドの変数名は単語間を_で継なぎ、さらに全て大文字で記述する。
static finalフィールドをクラスの中でのみ使用する場合にはprivateフィールドに、外からも使用できるようにする場合にはpublicフィールドにした方が良いだろう。
ただし、publicフィールドとする場合、それぞれのクラスに作ると検索や修正が面倒になるため、通常は専用のクラスをひとつ作り、その中にまとめてpublic static finalフィールドを宣言する方法をとる。
慣例的に「static」「final」の順番で書かれることが多いが、「final」「static」でも同様に機能する。
フィールドに「static final 型 フィールド名 = 初期値;」の形式で使用する。
このstatic finalフィールドは、staticフィールドのため自クラスのインスタンスを作らずに使用できる。加えて、final変数のため値が変更できない。
以上の特性のため、定数を宣言する場合に使用される。
static finalフィールドは、リテラルの代わりとしてよく使用される。
プログラム上に直接書かれたリテラルは、修正が難しく可読性が下がる。
たとえば「System.out.println( 20 );」と書かれている場合に、この「20」という値の意味が一見分からない。また、プログラム上に複数の「20」がある場合、それぞれの値が同じ意味を持つのか、それとも別の意味の「20」なのかが判別できない。
そのため、この「20」という定数を含むプログラムが読み解きにくくなったり、この値を変更する際に注意が必要となってしまう。
そのため、リテラルはstatic finalフィールドとして宣言し、それを利用することが推奨される。
そうすることで、フィールドの名前から定数の意味が分かるため、可読性が上がる。また、定数値の変更はフィールド宣言の一箇所行えば済むため、修正が容易になる。
通常、static finalフィールドの変数名は単語間を_で継なぎ、さらに全て大文字で記述する。
static finalフィールドをクラスの中でのみ使用する場合にはprivateフィールドに、外からも使用できるようにする場合にはpublicフィールドにした方が良いだろう。
ただし、publicフィールドとする場合、それぞれのクラスに作ると検索や修正が面倒になるため、通常は専用のクラスをひとつ作り、その中にまとめてpublic static finalフィールドを宣言する方法をとる。
慣例的に「static」「final」の順番で書かれることが多いが、「final」「static」でも同様に機能する。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
/**
* static finalフィールド。
* アクセス修飾子は付けていませんが、通常、
* クラス内でのみ使用するときはprivateフィールド、
* 他のクラスから使う時にはpublicフィールドにします。
* finalで定数値化されているので、publicでも問題
* ありません。ただ、publicフィールドの場合には
* 定数値を入れる専用のクラスを作り、その中にまとめた方が
* いいでしょう。
*/
static final String SYSTEM_NAME = "JavaA2Z";
public static void main( String[] args )
{
// 定数値SYSTEM_NAMEを使用します。
System.out.println( SYSTEM_NAME );
// JavaA2Z
// staticフィールドなので、staticメソッドからも
// 普通のメソッドからも使えます。
// finalなので変更できません。
// ※コンパイルエラーの例
// SYSTEM_NAME = "あいうえお";
// ※エラーメッセージ
// final フィールド Sample.SYSTEM_NAME には代入できません
// ※コンパイルエラーの例ここまで
// SYSTEM_NAMEはStringクラスの参照型変数なので、
// 参照が指し示す先のインスタンスの中身は
// 変えうることができます。ただし、この場合は
// Stringクラスなので、Stringクラスの性質として
// 中身を変更できない(「インスタンスは不変」ということ)
// ため、定数値として使用できます。
// 逆に言えば、そういうクラスを使用すべきということです。
}
// static finalではなく、逆のfinal staticでも同じです。
final static int MAX = 300;
}
public class Sample
{
/**
* static finalフィールド。
* アクセス修飾子は付けていませんが、通常、
* クラス内でのみ使用するときはprivateフィールド、
* 他のクラスから使う時にはpublicフィールドにします。
* finalで定数値化されているので、publicでも問題
* ありません。ただ、publicフィールドの場合には
* 定数値を入れる専用のクラスを作り、その中にまとめた方が
* いいでしょう。
*/
static final String SYSTEM_NAME = "JavaA2Z";
public static void main( String[] args )
{
// 定数値SYSTEM_NAMEを使用します。
System.out.println( SYSTEM_NAME );
// JavaA2Z
// staticフィールドなので、staticメソッドからも
// 普通のメソッドからも使えます。
// finalなので変更できません。
// ※コンパイルエラーの例
// SYSTEM_NAME = "あいうえお";
// ※エラーメッセージ
// final フィールド Sample.SYSTEM_NAME には代入できません
// ※コンパイルエラーの例ここまで
// SYSTEM_NAMEはStringクラスの参照型変数なので、
// 参照が指し示す先のインスタンスの中身は
// 変えうることができます。ただし、この場合は
// Stringクラスなので、Stringクラスの性質として
// 中身を変更できない(「インスタンスは不変」ということ)
// ため、定数値として使用できます。
// 逆に言えば、そういうクラスを使用すべきということです。
}
// static finalではなく、逆のfinal staticでも同じです。
final static int MAX = 300;
}
// Sample.java public class Sample { /** * static finalフィールド。 * アクセス修飾子は付けていませんが、通常、 * クラス内でのみ使用するときはprivateフィールド、 * 他のクラスから使う時にはpublicフィールドにします。 * finalで定数値化されているので、publicでも問題 * ありません。ただ、publicフィールドの場合には * 定数値を入れる専用のクラスを作り、その中にまとめた方が * いいでしょう。 */ static final String SYSTEM_NAME = "JavaA2Z"; public static void main( String[] args ) { // 定数値SYSTEM_NAMEを使用します。 System.out.println( SYSTEM_NAME ); // JavaA2Z // staticフィールドなので、staticメソッドからも // 普通のメソッドからも使えます。 // finalなので変更できません。 // ※コンパイルエラーの例 // SYSTEM_NAME = "あいうえお"; // ※エラーメッセージ // final フィールド Sample.SYSTEM_NAME には代入できません // ※コンパイルエラーの例ここまで // SYSTEM_NAMEはStringクラスの参照型変数なので、 // 参照が指し示す先のインスタンスの中身は // 変えうることができます。ただし、この場合は // Stringクラスなので、Stringクラスの性質として // 中身を変更できない(「インスタンスは不変」ということ) // ため、定数値として使用できます。 // 逆に言えば、そういうクラスを使用すべきということです。 } // static finalではなく、逆のfinal staticでも同じです。 final static int MAX = 300; }