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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM