static final、定数クラス、enum理解の基礎知識。Javaプログラムの定数の定義についてまとめています。
Javaプログラムでは、あらかじめ決められた値を名前で定義することができます。これが定数です。
定数は、変数のように値を変化させることができません。また、定数を使用する場合にも宣言が必要です。
ソースコード中に具体的な値(マジックナンバー)を埋め込むとメンテナンスがしにくくなるので、 将来を考えない、よくないコーディングスタイルです。
例えば、プログラムに「ここで入力できる文字数は64文字以下じゃないと後のDBの処理の制限でエラーになる」という制限があります。 このとき、文字列の長さの限界となっている64という数字を、条件判断を行う部分に直接書いてしまうとダメです。 64はマジックナンバーです。
なぜマジックナンバーがダメか、理由をまとめてみます。
判定文に64と書いてあっても、何を表すのかすぐにわからないです。 でも64の代わりに、たとえばMAX_INPUT_LENGTH_BY_DB_COLUMNSという名前が付いていたら、データベースのカラムの制限による入力制限と、意味が分かりやすくなりますね。
今は「ここで入力できる文字数は64文字以下じゃないと後のDBの処理の制限でエラーになる」ですが、将来、仕様変更があって「256文字以下」に変わるかもしれません。 64というマジックナンバーがソースコード中に記述されていると修正が難しくなります。
なぜかというと、コードが大きくなると64という数字がソースコードのいたるところで記述されるからです。 この64は何の64??と判別しなくてはいけなく、機械的に256に置き換えることができません。 ひとつひとつ影響範囲を調べないといけませんし、影響のあるかもしれない範囲が増えて大変です。 一瞬で修正が終わる作業が、ものすごく大変な作業になってしまいます。
前置きが長くなりましたが、以下でJavaの定数について見ていきます。 まずは、static finalを使用した定数の定義方法を覚えて、定数クラス、必要に応じてenumを使用した定数クラスが使えるようにというような構成にしています。
定数を定義するときには、データ型の前に「static final」を指定します。
<アクセス修飾子> static final 型名 定数名 = 値;
キーワードstaticの次にfinalのキーワード、データ型、定数の名前、値を記述します。
定数の宣言と値の格納の例を以下に示します。
public class Sample { //定数の宣言 static final int INT = 1234; static final char CHAR = 'C'; static final boolean BOOL = true; public static void main(String[] args) { System.out.println(INT); System.out.println(CHAR); System.out.println(BOOL); } }
以下はコンパイルと実行の例です。
javac Sample.java java Sample 1234 C true
上述の定数(タイプコード)を一定の系統にまとめたクラスにすれば定数クラスができ上がります。 例えば、以下のようにColorsクラスを作成すれば定数クラスになります。
public final class Colors { public static final int RED = 1; public static final int BLUE = 2; public static final int GREEN = 3; }
このようにColorsクラスに色関連のタイプコードを定数クラスとしてまとめます。 使う場合は、Colors.定数名というようにして使います。
public class Sample { public static void main(String[] args) { System.out.println(Colors.RED); System.out.println(Colors.BLUE); System.out.println(Colors.GREEN); } }
上述のようなstatic finalを使用した定数クラスは、Javaの開発現場でたまに見かけることがあります。 コードが整理されたり、システムの仕様を定義している値など把握しやすくいいのですが、だんだん問題点がでてきます。
冒頭のマジックナンバーの話より、定数が使用されないよりはいいのですが、 static finalを使用した定数クラスには問題点があります。
たとえば、上述のColorsクラスのように色の値を事前に決めておくのですが、この定数はあくまでもint型の値です。 それらの値を引数にとるメソッドでは引数の型をintとして宣言することになったりします。 実行時に1、2、3以外の値や意図と異なる値が渡される可能性があり、「タイプセーフでない」状態となってしまいます。 それを回避するためには、専用のクラスなどをつくる必要がありますが、予想外のnullポインタ例外など不具合の作り込みの要因も増えます。
つまり問題点をまとめると以下のような「型チェックが作用しない」、「タイプセーフではない」原因があります。
このような課題を解決するために用意された機能として、Javaにはenumがあります。 長くなりますので、別のページにまとめています。 参考にしていただければと思います。
定数クラスや使い方、サンプル、java.lang.Enumクラスなど。Javaのenum(列挙型)とは何かについてまとめています。
もっと知識を広げるための参考です。
static変数、staticメソッド、staticイニシャライザ、staticインポートなど。Javaのstatic修飾子についてまとめています。
クラス、メソッド、変数、引数での使い方など。Javaのfinal修飾子についてまとめています。
Javaとは?から言語の枠を超えるところまで、Java言語についてまとめています。
スポンサーリンク
サイト内のページ
言語
C・C++
/HTML
/Java
/JavaScript
/PHP
/シェルスクリプト
開発環境
Ant
/Burp
/Eclipse
/Fiddler
/gcc
/gdb
/Git
/g++
/JDK
/JMeter
/JUnit
/Teraterm
/ZAP
技術・仕様
Ajax
/CORBA
/Jakarta EE(旧称J2EE、Java EE)
/JNI
ライブラリ/Framework/CMS
bootstrap
/jQuery
/FuelPHP
/Lucene
/MyBatis
/Seasar2
/Spring
/Struts
/WordPress
Web API
Google Maps
ITインフラOSとミドルウェア
Linux
/Windows
/シェル
ActiveMQ
/Tomcat
/MariaDB
/MySQL
/Nagios
/Redis
/Solr
ITインフラセキュリティ
公開サーバーのセキュリティ
SI
ホームページの作り方
スポンサーリンク
関連サイト内検索ツール
zealseedsおよび関連サイト内のページが検索できます。
IPアドレス確認ツール
あなたのグローバルIPアドレスは以下です。
3.145.91.111
HTMLの表示色確認ツール
パスワード生成ツール
文字数のプルダウンを選択して、取得ボタンを押すと「a~z、A~Z、0~9」の文字を ランダムに組み合わせた文字列が表示されます。
ここに生成されます。
スポンサーリンク
Copyright (C) 2007-2024 zealseeds. All Rights Reserved. Loarding…