题记
两天前的几乎所有时间,我一点也不看好Kotlin,但就在昨天我看到了一些Kotlin代码片段时,改变看法了。如下:
private fun startCamera() {
// Create configuration object for the viewfinder use case
val previewConfig = PreviewConfig.Builder().apply {
setTargetResolution(Size(640, 480))
}.build()
// Build the viewfinder use case
val preview = Preview(previewConfig)
// Every time the viewfinder is updated, recompute layout
preview.setOnPreviewOutputUpdateListener {
// To update the SurfaceTexture, we have to remove it and re-add it
val parent = viewFinder.parent as ViewGroup
parent.removeView(viewFinder)
parent.addView(viewFinder, 0)
viewFinder.surfaceTexture = it.surfaceTexture
updateTransform()
}
// Bind use cases to lifecycle
// If Android Studio complains about "this" being not a LifecycleOwner
// try rebuilding the project or updating the appcompat dependency to
// version 1.1.0 or higher.
CameraX.bindToLifecycle(this, preview)
}
像上面那样,
- apply中将属性定义都括了起来
- 不用写new
- set listener时直接抛过去个闭包
我滴个神啊,就是我理想的语言的。正巧CameraX的样例也是Kotlin写的,我也模仿着练手吧。
为什么出现问号泛滥问题
这么一丢丢代码,八个问号?????说好的解决了Java中空指针异常的问题,这么解决的?????关键问题是,我一个viewFinder变量,用一次就要“?”一次,太不方便了,Java中我还可以在方法的开头判断下viewFinder==null
就return
的,这里反而更复杂了。难以接受,宝宝不信。
问题的处理
有时候事情发生的就是这么巧,写CameraX代码时,我记得看到了一行代码,
private val displayManager by lazy {
requireContext().getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
}
马上让我想起了在Java中有时候定义个Lazy来实现延迟赋值,为什么会有这样的需求呢,留个TODO吧:
- 完善Lazy实现博客
那Kotlin中这个lazy关键字很可能也是用来延迟赋值的。自己照着这行代码写一晌愣是没把语法拼对,红色的曲线一直在下边飘着,如下:
心塞啊,只能去翻文档了,文档如下:
委托属性
不想看文档的,核心要点如下:
首先,Kotlin的关键字lazy确实可以实现延迟赋值,这一功能是依托于委托属性这一语言特性的。lazy属于委托的一个实现,Kotlin目前为三种委托提供了实现,方便我们直接使用。lazy标准叫法叫延迟委托。
- 使用该委托时,值必须为val,因为Lazy中value定义为val
- 改委托会求值时默认会加同步锁,可以通过将LazyThreadSafetyMode值作为参数传递个lazy函数来控制线程同步方式
基于以上,修改如下:
结果
perfect!!!几乎已经没有了问号。
问题延伸
之前看过一篇文章(其实很多地方都这样讲),说Kotlin通过“?”、“!!”处理了Java中的空指针问题。看完后认认真真的去了解了他们两个在Kotlin中的应用,依然很难叫我信服。因为我认为空指针问题的避免绝不可能通过语言就处理掉了,而是应该人为的在编码上去避免该问题。具体的留个TODO:
- 空指针问题的处理