• このエントリーをはてなブックマークに追加

スポンサードリンク

はじめに

今日から仕事ではじめて 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));		
	}
}