はじめに
今日から仕事ではじめて Java の開発をはじめることになったので, とてもうれしい.
Java の常識あるあるのなかに, ユーティリティクラスというものがある. みんな当たり前のように話しているけれども, 自分は知らないので調べた.
ユーティリティクラスとは
以下の特徴をもつ.
- いろんなところで繰り返し利用される処理をまとめたクラス.
- インスタンス化されない.
- すべてのメソッドは static で宣言される.
- 状態を持たない処理をユーティリティにすることが多い.
C 言語 とかでよくライブラリと呼ばれているのを見かけたことがある. オブジェクト指向っぽくない. そんなことを考えたら, 同じような意見をちらほら発見した.
- ユーティリティクラス不要論 | anopara
- 関数とユーティリティクラスは禁止 - 株式会社アークシステム (infoARK)
- ユーティリティクラスを Singleton にしたときのデメリット - Java Solution - @ IT
実現方法
メソッドには 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));
}
}