zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Matlab 画图
    OfferCome-0531
    OfferCome--0528
    剑指offer(2)
    剑指offer(1)
    MySQL的自增主键
    java Junit 测试
    sql 注入问题
    Facebook Libra
    markdown的博客
  • 原文地址:https://www.cnblogs.com/naray/p/12992772.html
Copyright © 2011-2022 走看看