如何避免Kotlin问号泛滥

题记

两天前的几乎所有时间,我一点也不看好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)
}

像上面那样,

  1. apply中将属性定义都括了起来
  2. 不用写new
  3. set listener时直接抛过去个闭包

我滴个神啊,就是我理想的语言的。正巧CameraX的样例也是Kotlin写的,我也模仿着练手吧。

为什么出现问号泛滥问题

泛滥的问号
这么一丢丢代码,八个问号?????说好的解决了Java中空指针异常的问题,这么解决的?????关键问题是,我一个viewFinder变量,用一次就要“?”一次,太不方便了,Java中我还可以在方法的开头判断下viewFinder==nullreturn的,这里反而更复杂了。难以接受,宝宝不信。

问题的处理

有时候事情发生的就是这么巧,写CameraX代码时,我记得看到了一行代码,

    private val displayManager by lazy {
        requireContext().getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
    }

马上让我想起了在Java中有时候定义个Lazy来实现延迟赋值,为什么会有这样的需求呢,留个TODO吧:

  • 完善Lazy实现博客

那Kotlin中这个lazy关键字很可能也是用来延迟赋值的。自己照着这行代码写一晌愣是没把语法拼对,红色的曲线一直在下边飘着,如下:
没写对
心塞啊,只能去翻文档了,文档如下:
委托属性
不想看文档的,核心要点如下:
首先,Kotlin的关键字lazy确实可以实现延迟赋值,这一功能是依托于委托属性这一语言特性的。lazy属于委托的一个实现,Kotlin目前为三种委托提供了实现,方便我们直接使用。lazy标准叫法叫延迟委托。

  1. 使用该委托时,值必须为val,因为Lazy中value定义为val
  2. 改委托会求值时默认会加同步锁,可以通过将LazyThreadSafetyMode值作为参数传递个lazy函数来控制线程同步方式
    基于以上,修改如下:
    成功

结果

结果
perfect!!!几乎已经没有了问号。

问题延伸

之前看过一篇文章(其实很多地方都这样讲),说Kotlin通过“?”、“!!”处理了Java中的空指针问题。看完后认认真真的去了解了他们两个在Kotlin中的应用,依然很难叫我信服。因为我认为空指针问题的避免绝不可能通过语言就处理掉了,而是应该人为的在编码上去避免该问题。具体的留个TODO:

  • 空指针问题的处理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章