Java

【Java】定数クラスを今一度考える!定数クラスを侮ることなかれ!

何の言語でも開発するときは定数クラスは必ずと言ってもいいほど作成することになると思います。

特に共通定数

よく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を成功に導くにはこういった共通仕様をきちんとで定義するように心がけて良い製品を作成していきましょう。

ABOUT ME
Ikumasa
3人家族の夫やってます。結婚4年目突入しました。 私はFF7Rにはまってます。 嫁はあつ森です。嫁はカニです。 仕事は設計業務から開発工程を中心に仕事しています。 高専(電子科)→情報系大学編入→2014年情報系大学院卒→IT企業就職~現在に至 主にJavaでの開発に従事、多少VB.NETでの開発も。 Framework:Struts、Seaserなどを経験。 DB:oracle11g,postgreSQL,MySQL,SQLite,SqlServerなど。 JP1を活用したバックエンド側を中心に3年ほど実施。 当時はLinuxOSでのShellScriptなど。携わった言語は広く浅く長くw どちらかというとバックエンドよりのエンジニア。 最近はフロントエンド側もやってます。 独学でFlutterなどの新規案件獲得に向け日々勉強中