7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Lazy constructorって何だっけ?

Last updated at Posted at 2014-05-29

♪Please don't say "You are lazy"
だって本当はCrazy
能あるクラスはそう
最初のメソッドが呼ばれた時に初期化されるんです♪

\JASRACの者ですが!/


Lazy construtorって単語が頭から離れないんですけどこれ何なんでしたっけ?
Lazy initializationとは何か違うんでしたっけ?
とはいってもググってもあまり出てこないので多分僕の頭の中で勝手に出来た造語なのであろう…。


Lazy initialization(遅延初期化)とは、最初にメソッドが呼ばれた時初めて初期化されるクラスである。
実装としては多分こんな感じ。
他にもっといい方法があるのかもしれませんが使ったことが無いので知りません…

class Lazy{
	double value;
	public:
	Lazy():value(0.0){
	}
	double getValue(){
		if (value == 0.0) {
			value = 4.0 * atan(1.0);
		}
		return value;
	}
};

int main(int argc,char **argv){
	Lazy test;
	printf("%e\n", test.getValue());
	return 0;
}

さて、まずはメンバ変数の宣言から。
今回は倍精度型のvalueという名前にしました。
で、コンストラクタで値を初期化する。
今回はダミー値として0.0にしてみました。
で、メンバ関数としてgetValue();を用意しておきませう。
この人はこのスコープの中でvalue == 0.0なら値を突っ込みます。
今回は円周率で。
で、valueをリターン。当然円周率が帰ってくると。

さて、メインルーチンへ。
この人はまず最初にLazyクラスのインスタンスを作ります。
この時点ではコンストラクタが叩かれただけなのでvalueの値は0です!
しかしながら実際にvalueの値を使おうとしてgetValue();を叩くと…あら不思議!円周率が!
つまりこのオブジェクトはインスタンスが作成された時点では仮値が入っていますが、
使う時に正しい値が放り込まれて円周率になったわけです。
インスタンス作成時では初期化せず、使われる時に初めて初期化される、遅延初期化っぽい感じですね!
((微妙にvalue(0.0)が初期化に見えん事も無いけど…))
((あとこれだとgetValue()する度に条件分岐が生まれてヤだからstatic何かで何とか出来ないかしらとかね!))
((あと初期値が0.0ってのもちょっとヤですよね!undef的な何かがいいですよね!))


で、これどういうところに使うのって話ですが。
要は

class Lazy{
	type 使うか使わんかよくわからんけどとても初期化に時間のかかる何か1;
	type 使うか使わんかよくわからんけどとても初期化に時間のかかる何か2;
}

みたいなのがあるときいいわけです。
この時、いくら使うか使わんかわからんからと言って、両方の変数を時間かけて初期化するのはリソースの無駄なわけです。
こういう時こそ、インスタンスは作っておくが、使うとき初めて初期化を行う事で、使わない時は初期化のコスト無しにコードを動かす事ができるわけです。


しかしまぁ、使ったことが無い上に使う予定もあまりないから、合っているのかよくわからない文章である。
あんまり信用しないほうがいいかも?

7
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?