kotlin 定义全局android时使用“lateinit”或“by lazy”,widget变量/瓦尔

uemypmqf  于 2023-03-03  发布在  Kotlin
关注(0)|答案(2)|浏览(168)

当定义一个全局变量android.widget时,例如TextView,使用lateinit还是by lazy更好?我最初认为使用by lazy会更好,因为它是不可变的,但我不完全确定。
by lazy示例:

class MainActivity: AppCompatActivity() {

    val helloWorldTextView by lazy { findViewById(R.id.helloWorldTextView) as TextView }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        updateTextView(helloWorldTextView)
    }

    fun updateTextView(tv: TextView?) {
        tv?.setText("Hello?")
    }
}

lateinit示例:

class MainActivity: AppCompatActivity() {

    lateinit var helloWorldTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        helloWorldTextView = findViewById(R.id.helloWorldTextView) as TextView
        updateTextView(helloWorldTextView)
    }

    fun updateTextView(tv: TextView?) {
        tv?.setText("Hello?")
    }
}

在定义全局android.widget var/瓦尔时,使用一个变量比使用另一个变量有什么好处吗?使用by lazy定义android.widget val有什么缺陷吗?是否只是根据您想要可变值还是不变值来决定?

xu3bshqb

xu3bshqb1#

by lazy有一个缺陷。widget属性是只读的,因此在技术上是最终的(用Java术语来说)。但是没有文档可以保证onCreate()对于一个示例只被调用一次。而且findViewById()可能返回null
因此,使用lateinit是更可取的,您将获得一个异常,告诉您val是否在onCreate()之前使用。
第三种可能性是Android synthetic properties,这样就完全不用担心变量了。

import kotlinx.android.synthetic.main.activity_main.*

helloWorldTextView.text = "Hello?"
7gcisfzg

7gcisfzg2#

以下是lateinit和by lazy之间的一些主要区别
*var总是与lateinit一起使用。当您使用关键字lateinit声明任何变量时,内存将在声明时分配给该变量
*瓦尔by lazy一起使用,这意味着由lazy关键字声明的变量将在**oncreate()**中使用时分配内存

相关问题