当定义一个全局变量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有什么缺陷吗?是否只是根据您想要可变值还是不变值来决定?
2条答案
按热度按时间xu3bshqb1#
by lazy
有一个缺陷。widget属性是只读的,因此在技术上是最终的(用Java术语来说)。但是没有文档可以保证onCreate()
对于一个示例只被调用一次。而且findViewById()
可能返回null
。因此,使用
lateinit
是更可取的,您将获得一个异常,告诉您val
是否在onCreate()
之前使用。第三种可能性是Android synthetic properties,这样就完全不用担心变量了。
7gcisfzg2#
以下是lateinit和by lazy之间的一些主要区别
*var总是与lateinit一起使用。当您使用关键字lateinit声明任何变量时,内存将在声明时分配给该变量
*瓦尔与by lazy一起使用,这意味着由lazy关键字声明的变量将在**oncreate()**中使用时分配内存