问题描述
在我们的 Adobe Coldfusion 项目中,我们将一些组件用作单例,例如:
component name="Util" {
public function init() {
variables.settings = loadFromConig();
variables.prefix = "my_";
return this;
}
public string function getPrefix() {
return variables.prefix;
}
public struct function getSettings() {
return variables.settings;
}
}
这应该正常工作,因为必须始终首先执行 init() 函数,以便能够调用任何其他方法。 我担心的是:如果 loadFromConig() 函数花费的时间太长并且某些 getter 方法抛出未定义的变量异常,是否有没有按预期发生的风险(例如在压力测试条件下)?
一般来说,在构造函数(方法 A)中使用变量范围定义一些“常量”是一个好习惯,还是使用属性更好改为使用默认值(方法 B),或者直接在 getter 中硬编码“常量”是否更安全:
public string function getPrefix() {
return "my_";
}
(方法 C)?
我使用方法 A - 在这些行周围放置一个 cflock 是否是个好主意:
variables.settings = loadFromConig();
variables.prefix = "my_";
在构造函数中或者这样的锁会无用吗?
解决方法
在重新思考这个问题之后,我得出的结论是,最好将 final 变量用作常量,因为一旦初始化 final 变量就无法更改它的值。
component{
final prefix = "my_";
function checkPrefix(){
writeoutput("prefix: " & prefix);
}
}