Kotlin之类属性延迟初始化
Posted naray
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin之类属性延迟初始化相关的知识,希望对你有一定的参考价值。
类属性延迟初始化
在android中声明UI类型变量,由于Kotlin的类型安全机制必须进行初始化,比如:
Java:
1 public class TestActivity extends AppCompatActivity { 2 3 private TextView mTvNmae; 4 5 @Override 6 protected void OnCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 10 mTvNmae = findViewById(R.id.name); 11 } 12 }
Kotlin:
解决方法1 初始化为Null:
1 class MainActivity : AppCompatActivity() { 2 3 private var mTvName: TextView? = null 4 5 override fun onCreate(savedInstanceState: Bundle?) { 6 super.onCreate(savedInstanceState) 7 setContentView(R.layout.activity_main) 8 9 mTvName = findViewById(R.id.name) 10 } 11 }
初始化问题解决了,但是使用上非常不友好。
解决方法2 延迟初始化:
1 class MainActivity : AppCompatActivity() { 2 3 private lateinit var mTvName: TextView 4 5 override fun onCreate(savedInstanceState: Bundle?) { 6 super.onCreate(savedInstanceState) 7 setContentView(R.layout.activity_main) 8 9 mTvName = findViewById(R.id.name) 10 } 11 }
这方式也解决了初始化问题,就是mTvName是一个可变类型变量,在初始化后基本上不会改变变量的赋值了。
解决方法3 延迟初始化 lazy (推荐方式):
1 class MainActivity : AppCompatActivity() { 2 3 private val mTvName: TextView by lazy { 4 findViewById(R.id.name) 5 } 6 7 override fun onCreate(savedInstanceState: Bundle?) { 8 super.onCreate(savedInstanceState) 9 setContentView(R.layout.activity_main) 10 } 11 }
以上是关于Kotlin之类属性延迟初始化的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin类的初始化 ④ ( lateinit 延迟初始化 | ::属性名称.isInitialized 检查属性是否初始化 | lazy 惰性初始化 )
Kotlin类的初始化 ④ ( lateinit 延迟初始化 | ::属性名称.isInitialized 检查属性是否初始化 | lazy 惰性初始化 )