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

Dao*_*Wen 14 scala lazy-initialization

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

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

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

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

Rex*_*err 6

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

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

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

  • 我个人认为这个建议非常合理.这是关于副作用.如果您要添加一个`lazy`关键字来推迟副作用,那么您可能做错了.有时候,当某些计算真的*很长时,这也算作副作用(效果是可量化的暂停). (2认同)