Kotlin 學習筆記 (9) — 類別

Andy Lu
4 min readSep 1, 2020

在物件導向的基本原則 SOLID 中,S 代表著 Single Responsibility Principle (單一職責原則),也就是每一個類別都應該只有一個功能。

將每一個功能,分別拆成不同的小類別,在維護上、測試上、使用上就會變得相對容易。

定義一個類別

那麼,我們該如何定義一個類別呢?

Kotlin 與其他語言一樣,都是用 class 當作類別的關鍵字,如下例:定義一個名稱為 Student 的類別

class Student

一般來說,類別都會建立在與它同名的檔案中。

  • 若類別裡面是空的,不需要在後面接上 大括弧 {}。

建立實例

如上例,我們可以直接用類別名稱加上小括弧 (),來建立實例。

val student = Student()

類別函數、屬性

基於 SRP,我們應該將相同目的、相同功能的函數以及屬性定義在同一類別中,如下:

class Student {
val age = 20
fun sayHello() = println("Hello")
}

將類別實例化之後,使用 . 可以取用類別內的屬性或函數。

val student = Student()
student.age
student.sayHello()

屬性的 getter 與 setter

定義完屬性之後,Kotlin 會產生 field、setter、getter。

  • field:用來儲存屬性資料。
  • getter:決定如何讀取屬性值。
  • setter:決定如何設定屬性值,只有屬性定義為 var 才有 setter 方法。
class Student{
var name = "Andy" //field, setter, getter 皆被隱藏起來
}
val student = Student()
val name = student.name //getter
student.name = "Alex" //setter

覆寫 setter/getter

class Student{
var name = "Andy"
get() = field.toUpperCase()
set(value) {
field = "Mr. $value"
}
}
val student = Student()
val name = student.name //getter ANDY
student.name = "Alex" //setter Alex

可見性與封裝

上面的例子中,類別函數以及類別屬性都沒有可見性關鍵字,所以在類別實例化之後,所有為加上可見性關鍵字的都可以被呼叫 (看見)。

一般來說,每一個類別都需要確認哪些函數、變數是可以被外界取用,不需要被外界所取用的項目,則會把它給隱藏起來,這就是封裝 (Encapsulation) 的概念。

那麼,該如何將不想暴露給外界的函數、變數給隱藏起來呢?下表為 Kotlin 提供的可見性修飾符:

可見性修飾符
class Student{
var name = "Andy"
private val id = 1
}

小結

物件導向中,類別是最為重要的一部分,在本篇文章中,我們知道了如何建立一個類別,並且在類別裡面定義函數以及屬性。

基於單一職責原則,我們需要讓類別裡面的功能只負責一件事,並且根據需求將不必要暴露給外部的函數及屬性隱藏起來。

類別的概念雖然容易,但是需要用的好,就需要把單一職責原則銘記在心,如此,就不會建立一個太多功能的類別,最後就會變得難以測試、維護。

如果這篇文章有幫助到你,請👏鼓勵我。

謝謝🙇

參考

KotlinLang: Classes

--

--

Andy Lu
Andy Lu

Written by Andy Lu

Android/Flutter developer, Kotlin Expert, like to learn and share.

No responses yet