类属性延迟初始化
在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 }