Kotlin 類型進階

1、前言

<font face= 黑體>在 Kotlin 泛型(上) 中咱們已經將 Kotlin 的 泛型基礎 講完了,想要學習泛型進階,咱們要先了解幾個類。java

2、數據類 data class

2.一、數據類的定義

<font face= 黑體>只須要在一個普通類的前面加一個 data,普通類就變成了數據類了,能夠將它和 Java 的 JavaBean 作類比,以下:git

data class Book(val id: Long, val name: String, val author: Person)

<font face= 黑體>上面代碼中定義在柱構造器中的屬性又稱爲 component,能夠經過調用 book.component 方法獲取到構造器中屬性的值。github

val id = book.component1()
val name = book.component2()
val author = book.component3()

2.二、JavaBean vs data class

JavaBean data class
構造方法 默認無參構造 屬性做爲參數
字段 字段私有,Getter/Setter 公開 屬性
繼承性 可繼承也可被繼承 不可被繼承
component 想等性、解構等

2.三、如何合理的使用 data class

<font face= 黑體>咱們先來看一下 data class 的性質,以下:
data classsegmentfault

<font face= 黑體>經過上圖咱們知道咱們應該把 data class 當成一個數據結構來使用,不須要額外的實現,而且屬性類最好是基本類型和不可變的來保證 data class 不產生邏輯。

3、枚舉類 enum class

3.一、枚舉的定義

Java:數據結構

enum State {
    Idle, Busy
}

// 經過 name 方法返回名字 Idle
State.Idle.name()
// 經過 ordinal 返回序號 0
State.Idle.ordinal()

Kotlin:ide

enum class State {
    Idle, Busy
}

// 經過 name 方法返回名字 Idle
State.Idle.name
// 經過 ordinal 返回序號 0
State.Idle.ordinal

4、密封類 sealed class

4.一、密封類的概念

  • <font face= 黑體>密封類是一種特殊的抽象類;
  • <font face= 黑體>密封類的子類定義在與自身相同的文件中;
  • <font face= 黑體>密封類的子類的個數是有限的。

4.二、密封類的定義

sealed class PlayerState {
    // 構造器私有
    constructor()
    constructor(int: Int)
}

5、內聯類 inline class

  • <font face= 黑體>內聯類是對某一個類型的包裝;
  • <font face= 黑體>內聯類是相似於 Java 裝箱類型的一種類型;
  • <font face= 黑體>編譯器會盡量使用包裝的類型進行優化。

5.一、內聯類的定義

// 包裝 Int 類型,必須是 val
inline class BoxInt(val value: Int)

5.二、內聯類的方法

inline class BoxInt(val value: Int) {
    operator fun inc(): BoxInt {
        return BoxInt(value + 1)
    }
}

5.三、內聯類的繼承結構

<font face= 黑體>內聯類能夠實現接口,但不能繼承父類也不能被繼承。學習

// 實現接口是能夠的
inline class BoxInt(val value: Int): Comparable<Int> {
    override fun compareTo(other: Int)
            = value.compareTo(other)
}

6、源碼

源碼 已上傳至 github,有須要能夠直接下載。優化

相關文章
相關標籤/搜索