我为什么要重新实现懒惰?

时间:2012-10-18 16:52:44

标签: scala lazy-initialization

我在Twitter的Effective Scala页面上阅读了Lazyness [原文如此]的部分,其中包含了这个建议(重点是我的):

  

为此目的使用延迟字段[按需计算和缓存值],但在语义需要延迟时避免使用延迟。在这些情况下最好是明确的,因为它使成本模型明确,并且可以更精确地控制副作用。

我不明白为什么他们会提出这个主张。为什么在语义需要懒惰的情况下避免使用lazy关键字会更好(这意味着它对于程序中的正确性是必要的,而不是仅仅将其用作优化)。我不知道如何编写自己的懒惰初始化代码会比使用语言中内置的lazy关键字更清楚地表明 laziness是必需的这一事实!我知道将lazy字段用于线程安全会带来一些额外的开销,但我不认为这就是他们在这里得到的......

对于lazy使用我完全失踪的指南,是否有一些隐藏的优点,或者我最好忽略这个建议?

1 个答案:

答案 0 :(得分:6)

编辑:我现在不再确定是什么建议,所以在批评推特的建议时,请仔细考虑我的观点。 (但我在下面给出了自己的建议。)

我也不同意这个建议,但我(以前)认为他们的观点是懒惰太容易了。您为访问惰性值而支付性能损失,但除了访问正常的val之外,您在使用点没有注意到您正在执行任何操作。当然,这是使懒惰的val变得如此有用的一件事:你可以在懒惰的行为之间切换而不是根本不改变你的界面。但是如果人们用lazy随机加密他们的代码,关键区域的表现可能会受到影响(假设它不会超过懒惰评估),初始化顺序将更难预测(如果你和#39;重新执行许多副作用),等等。

即便如此,我认为明确更糟糕但你必须遵守纪律。如果你不能指望任何文件或纪律,也许最好完全避免它。