私は、オブジェクトが最終的に使用される関数で構築されなければならない不変的なコードをいくつか持っています(理想的ではないが部分的な仮定の)。コンストラクタコールの場所のスカラーコンパイル時のチェック
ムーを操作する責任を負う関数booがあるとします。 BOOを使用するBOOの
def boo(mooGen:() => Moo) {
val m = mooGen() // a new MOO must be created HERE
m.moo()
}
クライアントは関数は、所望の武を生成する()=>武、の種類に通過しなければなりません。
理想のクライアントの動作:
boo(() => new Moo(// specific parameters here))
武がブーイング本体の内部まで作成されません。
ただし、クライアントは簡単に次のコードを脱調することができます
val myMoo = new Moo(// specific parameters here)
boo(() => myMoo)
これは、我々はMOOの建設だけブーイングで発生したい不変を破ります。
基本的には、関数の呼び出しスタック内にmooGenの戻り値が作成されているのか、あらかじめ作成されているのかを判断したいと考えています。
実行時にこれを確認する方法はたくさんあります。しかし、このパターンを強制的に行う方法はありますかコンパイル時間?暗黙の言葉や何か他のものを巧みに使う?
アイデアがありがとうございます!