Sim*_*all 4 kotlin kotlin-lateinit
我正在学习Kotlin,阅读lateinit
关键字让我怀疑它的用处.考虑以下代码:
var testString: String? = null
lateinit var lateTestString: String
fun print() {
print(testString?.length)
print(lateTestString.length)
}
Run Code Online (Sandbox Code Playgroud)
获取字符串长度的唯一区别是通过使用?.
运算符检查它是否为null .使用lateinit
快捷方式在访问属性或调用方法时不必添加额外的问号?仅仅通过这个事实,我认为增加那个额外的问号比在访问lateinit
一个问题时获得异常更值得.
更多研究表明,这lateinit
对于尚未初始化变量的注射和/或单元测试是有益的,但它会是.但是,不值得拥有额外的东西?.
而不仅仅是.
为了不冒异常风险吗?
Ser*_*sev 16
lateinit
关键字存在以启用一个特定方案:当您的字段不能为空时,但您也无法在构造函数中初始化它或使用常量值.在您使用它之前,请确保初始化该值.如果不这样做,您将获得具有明确含义的特殊例外.
lateinit用法和"普通"可空字段之间的区别在于?.
后者传达了关于代码的错误消息:"这个东西有时可能为空".事实上,当它不能的时候.它只是比平时更早初始化(例如,使用依赖注入而不是构造函数).
使用
lateinit
快捷方式不必添加额外的问号
实际上它更接近于 的快捷方式!!
。我在代码中经常使用它,原因我将尝试描述。
可以这么说,故意选择这两个!!
是为了吸引人们对代码中“与类型系统打赌”的地方的注意。当在适当的地方使用时,这正是您想要的,但是现实生活中的项目中所有那些实际上是非 null 的变量呢?只是类型系统太弱而无法证明这一点?!!
当我可以轻松确定它们已初始化时,我不想看到我的代码库周围的所有内容激增。这种噪音会减弱发出的强信号!!
。
当您在代码中看到 a 时lateinit var
,您知道您只需查找周围上下文指定的任何初始化方法,以说服自己一切都很好。检查它是否正确使用非常容易,而且我从未见过由此产生的错误。
实际上,很高兴看到 Kotlin 设计师将现实开发人员的担忧置于严格的类型形式主义之上。
归档时间: |
|
查看次数: |
1217 次 |
最近记录: |