淺談Kotlin(六):data class的使用


使用data class的一大好處就是不用自己寫一堆toString()方法的代碼了。

一個簡單的類的寫法:

class User(var name : String, var age: Int) {
}

如果我們想打印這個類的一個對象的屬性值,一般直接調用toString()

但是如果不重寫,打印出來的就是對象的地址

var user = User()
user.name = "Alice"
user.age = 20
Log.i(Tag,"user -> $user")

打印結果:
com.mxqx.wankotlin.mvp.model.bean.User@ca1983c

那么想要看到具體的數據就要重寫toString()方法

class User(var name : String, var age: Int) {
override fun toString(): String {
return "User(name='$name', age=$age)"
}
}

細看Java中也是如此寫法,但是當類的屬性值特別多的時候,toString()內容也會異常的多

Kotlin則提供data class的方式來解決這個問題:

data class User(var name : String, var age: Int) {
}

則此時打印結果為:

user -> User(name=Alice, age=25)

 

可見data class 的toString函數會被復寫為打印具體屬性的值

 

data class使用的一些限制:

1、主構造函數必須要至少有一個參數
2、主構造函數中的所有參數必須被標記為val或者var
3、數據類不能有以下修飾符:abstract,inner,open,sealed

 

/***********************************************************************************/

深入學習data class 和 class的區別

1、toString函數會被復寫為打印具體屬性的值
2、新增components方法 , 獲取對應屬性的值
3、新增copy方法 , 可以用來修改具體屬性的值
4、重寫了hashCode方法 , 不再比較對象引用 , 而是比較對象的值

第一條不再說明

components的用法為:

component1表示主構造方法中的第一個屬性,component2表示主構造方法中的第二個屬性,

若主構造方法中有n個參數,則提供component1...componentn

 

 

 

copy的用法為:

以原來的對象為模板拷貝一個新的對象,可以指定所有或部分參數的值

 var user = User("Alice",25)
 var copyUser1 = user.copy("Jason", 26) // 建一個新的對象,name和age都賦新值
 var copyUser2 = user.copy(age = 30);   // 建一個新的對象,指定age賦新值
 Log.i(Tag,"user -> $user")
 Log.i(Tag,"copyUser1 -> $copyUser1")
 Log.i(Tag,"copyUser2 -> $copyUser2")

打印結果:

user -> User(name=Alice, age=25)
copyUser1 -> User(name=Jason, age=26)
copyUser2 -> User(name=Alice, age=30)

 

hashCode的用法為:

data類復寫hashCode函數 , 比較對象屬性的值 , 而非地址

非data類比較:

class User(var name : String, var age: Int ) {
}


var user1 = User("Alice",25)
var user2 = User("Alice", 25)
Log.i(Tag,"user1.equal(user2)->"+(user1.equals(user2)))

打印結果:
user1.equal(user2)->false

 

data類比較:

data class User(var name : String, var age: Int ) {
}


var user1 = User("Alice",25)
var user2 = User("Alice", 25)
Log.i(Tag,"user1.equal(user2)->"+(user1.equals(user2)))

打印結果:
user1.equal(user2)->true

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM