【问题标题】:Using an array of null instead of an optional使用 null 数组而不是可选数组
【发布时间】:2019-10-07 15:44:59
【问题描述】:

我想知道为什么一个大小为 1 的 null 数组而不是可选的:

https://github.com/android/architecture-components-samples/blob/master/GithubBrowserSample/app/src/test-common/java/com/android/example/github/util/LiveDataTestUtil.kt#L27

原码:

    @Throws(InterruptedException::class)
    fun <T> getValue(liveData: LiveData<T>): T {
        val data = arrayOfNulls<Any>(1)
        val latch = CountDownLatch(1)
        val observer = object : Observer<T> {
            override fun onChanged(o: T?) {
                data[0] = o
                latch.countDown()
                liveData.removeObserver(this)
            }
        }
        liveData.observeForever(observer)
        latch.await(2, TimeUnit.SECONDS)

        return data[0] as T
    }

为什么不使用:

 @Throws(InterruptedException::class)
    fun <T> getValue(liveData: LiveData<T>): T {
        var data: T? = null
        val latch = CountDownLatch(1)
        val observer = object : Observer<T> {
            override fun onChanged(o: T?) {
                data = o
                latch.countDown()
                liveData.removeObserver(this)
            }
        }
        liveData.observeForever(observer)
        latch.await(2, TimeUnit.SECONDS)

        return data!!
    }

使用数组比使用可选对象更好吗?为什么? 还是一样?

谢谢

【问题讨论】:

    标签: android kotlin android-architecture-components


    【解决方案1】:

    看项目history,文件原来是Java,但是直接翻译成Kotlin——原来的Java版本是here,你可以看到他们只是直接转换成Kotlin。

    虽然您提供的版本在 Kotlin 中更有意义,但在 Java 中没有这样的功能,因为您在匿名类或 lambda 中使用的局部变量必须是最终的。这就是使用单元素数组的原因。但是如果他们最初是用 Kotlin 编写的(或者如果他们要重构它),他们几乎肯定会按照你的方式来做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 2012-03-03
      • 2017-09-03
      • 1970-01-01
      相关资源
      最近更新 更多