何の言語でも開発するときは定数クラスは必ずと言ってもいいほど作成することになると思います。
特に共通定数。
よくCommonConst.java だったり、SystemConst.javaって名称で作成されていることが多いと思います。
これって、場合によってはゴミ箱になってますよね。
たまにCommonConstのクラスの中に1000行2000行の定数がだらだらと書かれているのを見ます。勘弁してほしいですね。例として挙げるなら、日付フォーマットの定数です。「FORMAT_YYYYMMDDHHMMSS」とかこういうものが沢山ある場合があります。
共通的に使っていいよの目的でここに書いているのだと思いますが、実際には使っているのその中の2割程度に集中していませんか?
定数として作るのを批判しているわけでなく、目的に沿って適切に区分けすることでプログラムの可読性も向上しますし、運用保守に最適化されるので、意識していけるようにしましょう!
定数クラス
共通定数クラス
共通の定数クラスは文字通り、全てにおいて、共通的な定数が定義されたクラスです。
共通定数は極力シンプルにすることを心がけましょう。
また、プロジェクトごとに定義すべきことは違うとは思いますが、プロジェクト特有の共通的なクラスの位置づけであるべきと考えます。
- ラインセパレータ(LF or CRLF)
- 拡張子(.CSV , .xlsx など)
- PJ特有の共通的な決まり事(10~20)
point! 大量に作らない! どこのPJでも使えるレベル
定数クラス、コード定義クラス
定数クラスといっても、開発するときによくあるのがPJ特有のコード値が存在します。コード値はPJ特有のものが多いです。例えば、社員の所属部署を表すコード(部署コード)だったり、品名を表すコード(品名コード)などがあるかと思います。
ただし、増減すると考えられるものは定数クラスにするのはお勧めできません。
その場合はDBで可変コードとして定義すべきです。
※性能を重視する場合、DBアクセスを減らすことを目的とする場合もあります。
定数、コード定義クラスを作成するにあたり、定数が範囲を明確に示すものであればenum型(列挙型)で定義することをおススメします。
enum型で定義することでそれ以外のものを引数として使用できなくすることも可能ですし、Stringで定数値と一致するか?などをチェックするよりも格段に安全性が増します。
また、enum型を拡張すれば、enum型に紐づく名称や、別パラメータなどを定義できますし、コードの一元化も可能です。
共通クラスに作成するのでなく目的に沿ったコードの仕訳をすることが重要です。
クラスの格納場所
コードを仕訳するようにするとした場合、定数クラスをとしてどこに置くべきでしょうか?
下記のようにクラスパスで目的別にするとより一層可読性が上がるのではないでしょうか
- jp.co.xxx.common.const
定数クラスを格納する場所 - jp.co.xxx.common.code
コード定義クラスを格納する場所
定数クラスの作成
定数クラスは基本的には不変です。そのため、インスタンスを生成させる必要はありません。インスタンスを生成する(=メモリに格納する容量を確保する)ため、基本的にはインスタンスを生成不可とします。
コンパイルする時点で定数値はstaticな文字としてコンパイラが格納してくれます。メモリ管理的な重要な意味を持ちます。
・privateでコンストラクタを生成
・クラスパスを階層で仕訳
package jp.co.xxx.common.code;
/**
* クラスのjavadoc<br>
*/
public class MoneySymbol {
/** インスタンスの生成禁止 */
private MoneySymbol(){
}
/** 日本 */
public static final String JPY = "¥";
/** アメリカ */
public static final String US = "$";
}
目的にそったクラスにすることでそのクラスを使う側からもわかりやすいです。
public class MyApp{
public static void main(String[] args) {
System.out.println(MoneySymbol.JPY + "1,000");
}
}
// 出力結果
¥1,000
実際に使用するクラスで見てみると、何の定数なのかが一目瞭然になります。可読性も上がりますし、メンテナンスがしやすいコード体系になります。
割と当たり前のようなことですが設計段階で決めておかないとコーダーは自由に作ります。何なら定数を定義せず、ハードコーディングをするような展開も考えられます。
PJを成功に導くにはこういった共通仕様をきちんとで定義するように心がけて良い製品を作成していきましょう。