類屬性延遲初始化
在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 }
