(十)kotlin資料類與密封類

2021-08-15 20:19:29 字數 1986 閱讀 2828

kotlin 可以建立乙個只包含資料的類,關鍵字為 data:

data 

class

user

(val name

:string

,val age

:int

)

編譯器會自動的從主建構函式中根據所有宣告的屬性提取以下函式:

如果這些函式在類中已經被明確定義了,或者從超類中繼承而來,就不再會生成。

為了保證生成**的一致性以及有意義,資料類需要滿足以下條件:

複製使用 copy() 函式,我們可以使用該函式複製物件並修改部分屬性, 對於上文的 user 類,其實現會類似下面這樣:

fun copy

(name

:string

=this

.name

,age

:int

=this

.age)=

user

(name

,age

)

使用 copy 類複製 user 資料類,並修改 age 屬性:

data 

class

user

(val name

:string

,val age

:int

)fun main

(args

:array

<

string

>)

輸出結果為:

user

(name

=jack

,age=1

)user

(name

=jack

,age=2

)

元件函式允許資料類在解構宣告中使用:

val jane 

=user

("jane",35

)val

(name

,age)=

jane

println

("$name, $age years of age"

)// prints "jane, 35 years of age"

標準庫提供了 pair 和 triple 。在大多數情形中,命名資料類是更好的設計選擇,因為這樣**可讀性更強而且提供了有意義的名字和屬性。

密封類用來表示受限的類繼承結構:當乙個值為有限幾種的型別, 而不能有任何其他型別時。在某種意義上,他們是列舉類的擴充套件:列舉型別的值集合 也是受限的,但每個列舉常量只存在乙個例項,而密封類 的乙個子類可以有可包含狀態的多個例項。

宣告乙個密封類,使用 sealed 修飾類,密封類可以有子類,但是所有的子類都必須要內嵌在密封類中。

sealed 不能修飾 inte***ce ,abstract class(會報 warning,但是不會出現編譯錯誤)

sealed

class

expr

data

class

const

(val number

:double):

expr

()data

class

sum(

val e1

:expr

,val e2

:expr):

expr

()object

notanumber

:expr

()fun

eval

(expr

:expr

):double

=when

(expr

)

使用密封類的關鍵好處在於使用 when 表示式 的時候,如果能夠 驗證語句覆蓋了所有情況,就不需要為該語句再新增乙個 else 子句了。

fun 

eval

(expr

:expr

):double

=when

(expr

)

Kotlin 資料類與密封類

資料類 kotlin 可以建立乙個只包含資料的類,關鍵字為 data data class user val name string,val age int 編譯器會自動的從主建構函式中根據所有宣告的屬性提取以下函式 equals hashcode tostring 格式如 user name jo...

Kotlin 資料類與密封類

kotlin可建立乙個只包含資料的類,關鍵字為data data class person val name string,val age int 編譯器會自動的從主建構函式中根據所有宣告的屬性提取以下函式 equals hashcode tostring 格式如 user name john,ag...

Kotlin 資料類與密封類

密封類end kotlin 可以建立乙個只包含資料的類,關鍵字為data data class user val name string,val age int 編譯器會自動的從主建構函式中根據所有宣告的屬性提取以下函式 如果這些函式在類中已經被明確定義了,或者從超類中繼承而來,就不再會生成。為了保...