我有一个类(Foo),它延迟加载一个名为(Bar)的属性。防止未初始化的支持字段被错误使用(由于智能感知或缺乏经验的工作人员)的首选方法是什么?
我可以想到3个选项:
class Foo {
// option 1 - Easy to use this.bar by mistake.
string bar;
string Bar {
get {
// logic to lazy load bar
return bar;
}
}
// option 2 - Harder to use this._bar by mistake. It is more obscure.
string _bar2;
string Bar2 {
get {
// logic to lazy load bar2
return _bar2;
}
}
//option 3 - Very hard to use the backing field by mistake.
class BackingFields {
public string bar;
}
BackingFields fields = new BackingFields();
string Bar3 {
get {
// logic to lazy load bar
return fields.bar;
}
}
}
请记住,我希望人们使用支持字段栏的唯一地方是属性的 setter 和 getter。在课堂上的其他任何地方,他们都应该始终使用 this.Bar
更新
我目前正在使用以下延迟实现(不是针对所有具有支持字段的属性,而是针对需要延迟加载、同步和通知的选定属性)。它也可以扩展到支持期货(稍后在单独的线程中强制评估)
注意我的实现在读取时锁定,因为它支持外部集。
另外,我想提一下,我认为这是一个可以在Ruby 中克服的语言限制。
您可以通过这种方式实现惰性。
x = lazy do
puts "<<< Evaluating lazy value >>>"
"lazy value"
end
puts x
# <<< Evaluating lazy value >>>
# lazy value