iT邦幫忙

3

Kotlin學習筆記 入門篇

  • 分享至 

  • xImage
  •  

1. var/val/lateinit

這三個關鍵字是在宣告參數時最常用到的幾個,常看到的寫法如下

val mValue1 = "value1"
lateinit var mValue2: String
var mValue3 = "value2"

說明一下大概用法以及跟Java Code是如何對應
基本上如果使用val定義參數,就一定要給予一個數值,並且在宣告之後不能再修改,類似Java final(mValue1)
使用var則可以選擇是否要立即給予與數值,如果不馬上給值就要加上lateinit告知編譯器(mValue2)。或者先設定預設值後續再修改寫法如(mValue3)


2. 冒號 :

目前我自己開發時很常碰到的幾個地方,沒寫到的不表示沒有喔,後續有碰到會再新增上來

  1. 繼承(extends)
class MainActivity : AppCompatActivity() {
    // 這邊的繼承是有括號的AppCompatActivity()
    // 因為在Java中沒有 所以需要特別注意
    // 如果是要繼承有建構子的class還需要帶入參數 後續補充
}
  1. 實作(implements)
class MainActivity : AppCompatActivity(), View.OnClickListener {
    // 同時有繼承、實作的寫法
    // 實作Interface就沒有括號了
    // 如果要實作多個Interface就繼續往後加上 , XXXXXX(Interface name)
}
  1. 回傳值(return)
// 定義回傳值為Int
override fun getItemCount(): Int {
    return mData.size
}
  1. 參數型態
// 定義mValue為String
lateinit var mValue: String

3. 問號?/雙驚嘆號!!

有加上問號才能將數值指派為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")
    }
}

4. switch case

比較一下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()
        }
    }
}

5. 建構子constructor

這邊我們綜合繼承使用
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) {

}

6. object/Singleton

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)

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言