Swift:返回闭包的未初始化Lazy变量使用合理性疑问
关于用
lazy闭包实现每次返回新实例的实践分析 首先得明确你的场景对应的代码大概是这样(假设是Swift这类常用lazy关键字的语言环境):
// 你的写法:每次访问time都会生成新的Date实例 var time: Date { lazy var newDate = Date() return newDate }
这种用法确实属于不良实践,而且你忽略了几个关键要点:
1. 完全违背lazy的核心语义
lazy的设计目标是延迟初始化且仅执行一次——它是用来缓存开销较大的对象或计算结果,避免在不需要的时候浪费资源。而你现在用它实现“每次调用都生成新实例”,和lazy的语义完全相反。其他开发者看到lazy的第一反应是“这个值只会初始化一次,后续访问都是缓存结果”,结果你的代码实际每次返回新对象,直接造成理解混淆,大幅提升代码维护成本。
2. 存在不必要的性能开销
多数语言的lazy实现都带有线程安全检查逻辑(比如Swift的lazy默认是线程安全的),每次访问lazy变量都会执行这些检查。而你每次都要生成新实例,这些检查完全是多余的性能浪费。换成以下写法就没这个问题:
// 语义清晰且高效的计算属性写法 var time: Date { return Date() } // 或者复用闭包逻辑的写法 let getCurrentTime = { Date() } // 调用时执行 getCurrentTime()
3. 代码可读性与可维护性差
你的写法必须额外加注释才能说明“这不是常规的lazy缓存,而是每次返回新实例”,否则很容易让后续维护者误解。而用符合需求语义的写法(计算属性/普通闭包),代码本身就能清晰表达意图,不需要额外解释。
总结
如果你的需求就是每次获取新的Date实例,完全没必要用lazy——直接用计算属性或者普通闭包就好,既符合语义,又清晰易懂,还没有额外的性能开销。用lazy来做这件事,属于“用错了工具”,只会给代码添乱。
内容的提问来源于stack exchange,提问作者Poweranimal
相关产品推荐
相关产品推荐

