From 944e0bb17e62fc00fc5d9996137bdeda462e161b Mon Sep 17 00:00:00 2001 From: Awin Huang Date: Fri, 30 Sep 2022 11:44:07 +0800 Subject: [PATCH] vault backup: 2022-09-30 11:44:07 Affected files: 03. Programming/Kotlin/class.md --- 03. Programming/Kotlin/class.md | 48 +++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/03. Programming/Kotlin/class.md b/03. Programming/Kotlin/class.md index 7a7071c..57ed85d 100644 --- a/03. Programming/Kotlin/class.md +++ b/03. Programming/Kotlin/class.md @@ -1,17 +1,61 @@ Kotlin中的class由class關鍵字開始,一個簡單的class如下: +```kotlin class VerySimple { } +``` 如果需要constructor的話,則在class名稱之後加入所需的參數,如下: +```kotlin class VerySimple(val para1: Int, val para2: String ) { } +``` 加在constructor中的參數會自動變成class的「成員變數」,如果在參數前面加上private,則會成「私有成員變數」,也就是無法被外部所存取。 ## 多個 constructor 前面所的constructor是建立class的,kotlin也允許建立其他constructor,但是這些「次要constructor」都必須呼叫「主要constructor」來進行初始化,如下: +```kotlin class VerySimple(val para1: Int, val para2: String ) { - constructor(val para1: Int): this(para1, para2=) -} \ No newline at end of file + 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」也可以加上邏輯判斷區塊,如下: +```kotlin +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」的執行區塊,如下: +```kotlin +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`區塊會在初始化之 \ No newline at end of file