這三個關鍵字是在宣告參數時最常用到的幾個,常看到的寫法如下
val mValue1 = "value1"
lateinit var mValue2: String
var mValue3 = "value2"
說明一下大概用法以及跟Java Code是如何對應
基本上如果使用val定義參數,就一定要給予一個數值,並且在宣告之後不能再修改,類似Java final(mValue1)
使用var則可以選擇是否要立即給予與數值,如果不馬上給值就要加上lateinit告知編譯器(mValue2)。或者先設定預設值後續再修改寫法如(mValue3)
目前我自己開發時很常碰到的幾個地方,沒寫到的不表示沒有喔,後續有碰到會再新增上來
class MainActivity : AppCompatActivity() {
// 這邊的繼承是有括號的AppCompatActivity()
// 因為在Java中沒有 所以需要特別注意
// 如果是要繼承有建構子的class還需要帶入參數 後續補充
}
class MainActivity : AppCompatActivity(), View.OnClickListener {
// 同時有繼承、實作的寫法
// 實作Interface就沒有括號了
// 如果要實作多個Interface就繼續往後加上 , XXXXXX(Interface name)
}
// 定義回傳值為Int
override fun getItemCount(): Int {
return mData.size
}
// 定義mValue為String
lateinit var mValue: String
有加上問號才能將數值指派為null
var mValue : String? = null
加上雙驚嘆號表示,我確定在這個時機,textView絕對不為null
var textView : TextView = findViewById(R.id.textView)
textView!!.text = "123"
常見組合起來的用法就是類似這樣,其實你自己有做好判斷,確定在這個時機下絕對不會為null,才會使用!!
fun setValue(textView: TextView?) {
if(textView != null){
textView!!.text = "123"
}
else{
println("textView is null")
}
}
比較一下Java/Kotlin寫法
// Java
public void onClick(View view) {
switch (view.getId()){
case R.id.button:
onBackPressed();
break;
}
}
比較大的差異是Kotlin字眼是用when並且不需要break
// Kotlin
fun onClick(view: View) {
when (view.id) {
R.id.button -> {
onBackPressed()
}
}
}
這邊我們綜合繼承使用
BaseViewModel需要宣告為open才能被繼承使用
可以注意到Repository沒有指派數值,也沒有宣告為lateinit但卻不會報錯,主要是因為這個值在建構子時已經指派了
open class BaseViewModel : ViewModel {
private var mRepository: Repository
constructor(repo : Repository) {
mRepository = repo
}
}
// 繼承傳遞建構子參數
// 在2.1 AppCompatActivity()有提到括號的部分,其實並不是括號,而是需要傳遞參數
class MainViewModel(repo : Repository) : BaseViewModel(repo) {
}
object有幾個用法,首先是object class,宣告及呼叫方法如下
object class其實就是Kotlin中Singleton的用法,不清楚Singleton可以到先前這篇文章稍微了解一下
object ApiService {
fun request() {
...
}
}
ApiService.request()
接下來是companion object
Kotlin用來定義成static參數或function方式
這邊可以看到還有一個叫做const的宣告,const必須放在object中
class Const {
companion object {
const val END_POINT = "https://www.google.com/"
fun getEndPoint() : String{
return END_POINT
}
}
}
// 呼叫
Const.END_POINT
Const.getEndPoint()
object介紹完要來討論一下Singleton,不是說Kotlin Singleton用object class就搞定了嗎
基本款是這樣沒錯,但是object class沒有辦法帶參數,這有點遺憾
所以我爬了一些文後有找到一些寫法不是用object class完成Kotlin Singleton
大概像這樣,這邊是比較基礎的寫法,我看到的還有用到also,後續再做一篇來解釋
class Repository {
// 我需要用到的參數 => Context
// 我想在實體化Singleton時帶入
private lateinit var mContext : Context
companion object {
@Volatile private var sInstance: Repository? = null
fun getInstance(context: Context): Repository {
if(sInstance == null) {
synchronized(this) {
sInstance = Repository()
sInstance!!.mContext = context
}
}
return sInstance!!
}
}
}
// 呼叫
Repository.getInstance(context)