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 惰性初始化 )

kotlin-延迟初始化

Kotlin 延迟初始化和密封类[第一行代码 Kotlin 学习笔记]

Kotlin的延迟初始化

Kotlin学习总结——变量常量数据类型条件语句