跳到主內容

【Kotlin】data class

Data Class vs 一般 Class

  1. 自動生成的方法

    • Data Class: Kotlin 編譯器會自動生成 equals()hashCode()toString() 等方法。
    • 一般 Class: 需要手動實現這些方法,或者使用 IDE 的插件來生成。
  2. 不可變性

    • Data Class: 可以聲明為 val 型,使其成員變量成為只讀。
    • 一般 Class: 需要額外的設計來實現不可變性,如使用 private 成員變量並提供 getter 方法。
  3. Component 函数

    • Data Class: Kotlin 可以通過 componentN() 函數來分解對象。
    • 一般 Class: 需要手動定義這些分解函數。

自動生成的方法

在這個示例中,Person 是一個 data class,它自動獲得了 toString()equals()hashCode() 方法,而 Car 是一個一般 class,我們需要手動實現 toString() 方法。

// Data Class
data class Person(val name: String, val age: Int)

// 一般 Class
class Car(val brand: String, val year: Int) {
  override fun toString(): String {
  return "Car(brand='$brand', year=$year)"
  }
}

不可變性

data class Person(val name: String, val age: Int)
fun main() {
   val person = Person("Alice", 30)
   println(person)
}
// Person(name=Alice, age=30)
class Person(name: String, age: Int){
	val name: String = name
        private set
    val age: Int = age
        private set
}

fun main() {
   val person = Person("Alice", 30)
   person.name("Jhon")
}

在 Kotlin 中,componentN() 函數是一種特殊的函數,用於解構(分解)對象。解構是一種語法糖,可以讓你將對象的屬性拆分成獨立的變量。這些函數在 data class 中是自動生成的,而在一般的 class 中則需要手動定義。

什麼是解構(Destructuring)?

解構(Destructuring)是一種語法特性,允許將對象的屬性分解成獨立的變量。這在需要從對象中提取多個值時非常有用。

Data Class 的 Component 函數

當你定義一個 data class 時,Kotlin 會自動為每個屬性生成 componentN() 函數。這些函數按照屬性在主構造函數中的聲明順序編號。例如,component1() 對應於第一個屬性,component2() 對應於第二個屬性,以此類推。

data class Person(val name: String, val age: Int)

fun main() {
    val person = Person("Alice", 30)
    
    // 使用解構聲明
    val (name, age) = person
    println("Name: $name, Age: $age")
    
    // 手動調用 component 函數
    val nameComponent = person.component1()
    val ageComponent = person.component2()
    println("Name: $nameComponent, Age: $ageComponent")
}

在這個示例中,Person 類是一個 data class,所以 Kotlin 會自動生成 component1()component2() 函數。你可以使用解構聲明 val (name, age) = person 來將對象的屬性分解成獨立的變量。

一般 Class 的 Component 函數

對於一般的 class,你需要手動定義 componentN() 函數來實現解構。這意味著你需要自己編寫這些函數,以便在解構時可以使用。

class Car(val brand: String, val year: Int) {
    operator fun component1() = brand
    operator fun component2() = year
}

fun main() {
    val car = Car("Toyota", 2022)
    
    // 使用解構聲明
    val (brand, year) = car
    println("Brand: $brand, Year: $year")
    
    // 手動調用 component 函數
    val brandComponent = car.component1()
    val yearComponent = car.component2()
    println("Brand: $brandComponent, Year: $yearComponent")
}

data class toString 改用 json 輸出

導入 Gson 庫:首先需要將 Gson 添加到你的專案依賴中。

dependencies {
    implementation 'com.google.code.gson:gson:2.8.8'
}