読者です 読者をやめる 読者になる 読者になる

kentsu.log

何かその時の興味でいろいろする人。最近はScala使ってる。アルゴリズムと自然言語処理、深層学習が大好き。

Javaオブジェクトのライフサイクル管理

はじめに

javaではnewを使うことで簡単にオブジェクトを生成できるが
プログラムの規模が大きくなると、オブジェクトの生成から消滅までの管理が複雑化してしまう

オブジェクトのライフサイクルを適切に管理するには以下のようなやり方がある

・変数のスコープに注意して不要に長い寿命のオブジェクトを減らす
・寿命の長いオブジェクトと短いオブジェクトを分離する
・ファクトリパターンなどを駆使する
・いっそフレームワークなどに隠す

このなかで一番簡単なファクトリパターンと
クラス自体を利用する方法についてまとめていく

ファクトリパターンとは

ファクトリパターンとはオブジェクト生成を一つの役割とみなしてそれを分離してしまうこと
またこれにはいくつかの技法があるが今回はファクトリメソッドに隠してしまいます

このときファクトリメソッドはstaticである必要があります

またファクトリメソッドを使うとするなら、コンストラクタは外部から参照出来ないようにprivateにしておくとよい
これはファクトリメソッドを使用する以外の方法でオブジェクトが生成されるのを防ぐため

実際のコード

これらを踏まえてファクトリパターンを使ったコードを実際に書いてみる

public class Test{

	//コンストラクタを外部から参照できないようにする
	private Test(){
	}

	//ファクトリメソッド
	static Test getInstance(){
		/*
		* Test test = new Test();
		* return test;でもいい
		*/
		return new Test();
	}
}

ファクトリパターンの利点

大きく3つの利点がファクトリパターンには存在する

・自由にメソッド名を付けられるので可読性を上げることができる
・ファクトリメソッドが必ず新規オブジェクトを返す実装にする必要がない
・戻り値の型を抽象型にできる

二番目はよくわからないと思いますが
オブジェクト生成にコストがかかる場合生成済みのオブジェクトをキャッシュして
ファクトリメソッドがプール内のオブジェクトを返すオブジェクトプーリングという技法の事です
これはオブジェクトを一種類に制限して必ず同一のオブジェクトを返すことで実現できる

クラス自体を利用

例えばStringクラスに対して

"hello".length()

のような使い方をするもので、クラスフィールドやクラスメソッドを直接参照する方法

これを実現させるのは簡単なのでわざわざ例を上げる必要はないと思いますが
注意点がいくつかあります

・finalクラスにして継承を禁止する
コンストラクタをprivateにする
・すべてのメソッドとフィールドにstaticをつける

利点は
・クラス利用者が必要なメソッドを探すときクラス名で絞り込めるようになる
メソッド呼び出し箇所を見た時に意味がわかりやすい



これらを適切に使うことでオブジェクトのライフサイクル管理がしやすくなります