Files
Obsidian-Main/03. Programming/Kotlin/class.md
Awin Huang 944e0bb17e vault backup: 2022-09-30 11:44:07
Affected files:
03. Programming/Kotlin/class.md
2022-09-30 11:44:07 +08:00

2.3 KiB
Raw Blame History

Kotlin中的class由class關鍵字開始一個簡單的class如下

class VerySimple {

}

如果需要constructor的話則在class名稱之後加入所需的參數如下

class VerySimple(val para1: Int, val para2: String ) {

}

加在constructor中的參數會自動變成class的「成員變數」如果在參數前面加上private則會成「私有成員變數」也就是無法被外部所存取。

多個 constructor

前面所的constructor是建立class的kotlin也允許建立其他constructor但是這些「次要constructor」都必須呼叫「主要constructor」來進行初始化如下

class VerySimple(val para1: Int, val para2: String ) {
    constructor(val para1: Int): this(para1, para2="someText")  // 第一個「次要constructor」
    constructor(val para2: String): this(para1=123, para2)      // 第二個「次要constructor」
}

不管是第一個「次要constructor」或是第二個「次要constructor」都必須呼叫主要的(val para1: Int, val para2: String )這一個「主要constructor」。

如果有邏輯上的需求「次要constructor」也可以加上邏輯判斷區塊如下

class VerySimple(val para1: Int, val para2: String ) {
    constructor(val para1: Int): this(para1, para2="someText")  // 第一個「次要constructor」
    constructor(val para2: String): this(para1=123, para2) {    // 第二個「次要constructor」
        if (para2 == "error") {
            println("Something wrong")
            para1 = 25 // 這行會錯誤因為para1是被宣告成val而不是var
        }
    }
}

init區塊

init是個優先權高於「主要constructor」的執行區塊如下

class VerySimple(val para1: Int, val para2: String ) {

    init {
        require(para1 > 0, {"para1 must larger than 0"})
        require(para2.isNotBlank(), {"para2 cannot be a empty string"})
    }

    constructor(val para1: Int): this(para1, para2="someText")  // 第一個「次要constructor」
    constructor(val para2: String): this(para1=123, para2) {    // 第二個「次要constructor」
        if (para2 == "error") {
            println("Something wrong")
            para1 = 25 // 這行會錯誤因為para1是被宣告成val而不是var
        }
    }
}

init區塊會在初始化之