はじめに

今日から仕事ではじめて Java の開発をはじめることになったので, とてもうれしい.

Java の常識あるあるのなかに, ユーティリティクラスというものがある. みんな当たり前のように話しているけれども, 自分は知らないので調べた.

ユーティリティクラスとは

以下の特徴をもつ.

  • いろんなところで繰り返し利用される処理をまとめたクラス.
  • インスタンス化されない.
  • すべてのメソッドは static で宣言される.
  • 状態を持たない処理をユーティリティにすることが多い.

C 言語 とかでよくライブラリと呼ばれているのを見かけたことがある. オブジェクト指向っぽくない. そんなことを考えたら, 同じような意見をちらほら発見した.

実現方法

メソッドには static をつける

static をつけることで, クラスをインスタンスすることなく メソッドを利用できる.

class SampleSingleton {
    static class SampleUtil {
        private SampleUtil () {} // インスタンス化を禁止するテクニック
        public static int plus (int x, int y) { return x + y; }
        public static int minus (int x, int y) { return x - y; }        
    }
    public static void main (String[] args) {
        System.out.println (SampleUtil.plus (1,1));
        System.out.println (SampleUtil.minus (2,1));        
    }
}

状態をもつ場合は, シングルトンパターンを適用する

なにかの値を保持する場合は, デザインパターンであるシングルトンパターンを利用する.

一般的なシングルトンパターンの実装方法は以下.

  • private な 定数に オブジェクトを保存
  • オブジェクトは getInstance () メソッドで取得

フライウェイトパターンで改良する

シングルトンパターンは フライウェイトパターンと合わせて利用されることがおおい.

特徴は,

  • private な 変数に オブジェクトを保存.
  • オブジェクトが存在すれば, getInstance で渡す. オブジェクトが存在しなければ, オブジェクトを作成して getInstance で渡す.

実装例

class SampleSingleton {
    static class SingletonUtil {
        private static final SingletonUtil INSTANCE = new SingletonUtil ();

        public static SingletonUtil getInstance (){ return INSTANCE; }
        public static int plus (int x, int y) { return x + y; }
        public static int minus (int x, int y) { return x - y; }        
    }


    public static void main (String[] args) {
        System.out.println (SingletonUtil.getInstance ().plus (1,1));
        System.out.println (SingletonUtil.getInstance ().minus (2,1));      
    }
}

または, Enum を利用するとという手もある. Effective Java の本では, この方法を推奨している.

class SampleSingleton {
    static public enum EnumUtil {
        INSTANCE;

        public static int plus (int x, int y) { return x + y; }
        public static int minus (int x, int y) { return x - y; }        
    }

    public static void main (String[] args) {
        System.out.println (EnumUtil.INSTANCE.plus (1,1));
        System.out.println (EnumUtil.INSTANCE.minus (2,1));     
    }
}

Special Thanks