Kotlin中dataclass
data class算是Kotlin中⼀⼤闪光点了
data class就是⼀个类中只包含⼀些数据字段,类似于vo,pojo,java bean。⼀般⽽⾔,我们在Java中定义了这个数据类之后要重写⼀下toString,equals等⽅法。要⽣成get,set⽅法。
然⽽在Kotlin中这些都不在需要⾃⼰⼿动去敲了,编译器在背后默默给我们⽣成了如下的东西:
equals()/hashCode()
toString()⽅法
componentN()⽅法
copy()⽅法
如何申明⼀个简单的数据类?有⼀下⼏点要求:
主构造函数必须要⾄少有⼀个参数
主构造函数中的所有参数必须被标记为val或者var
数据类不能有以下修饰符:abstract,inner,open,sealed
data class只能实现接⼝(Kotlin1.1以前的规则),现在也可以继承其它类
data class User(var id: Int, var name: String)
就这么⼀⾏代码,你已然拥有了⼀个数据类,就这么简单。来写⼏⾏代码测试⼀下相关的函数
fun main(args: Array<String>) {
var user: User = User(123,"liuliqianxiao")
var user2: User = User(123,"liuliqianxiao")
println(user.hashCode())
println(user2.hashCode())
println(user.equals(user2))// true
String())// User(id=123, name=liuliqianxiao)
}
主构造函数就是跟在类名后⾯的那个构造函数,必须⾄少要有⼀个参数,就代表了必须要有⼀个数据字段,hashCode,equals,toString都是要依据主构造函数来⽣成的
主构造函数中的所有参数必须被标记为var或者val,var就表⽰可读写,val就表⽰只读,这就相当于表明了数据字段的访问权限,这就达到了Java中我们⼿动⽣成set get的⽬的
编译器⾃动⽣成的toString函数格式如下:“类名(数据字段1=value1,数据字段2=value2,……)”
⼀旦我们⼿动编写了上述⽅法(必须要加上override 关键字),则编译器不会⾃动⽣成对应的⽅法
data class User(var id: Int,var name:String) {
//⼿动重写toString⽅法
override fun toString(): String{
return"[User(id = $id,name = $name)]"
}kotlin修饰符
}
再来看看⾃动⽣成的componentN()⽅法是⼲嘛⽤的
在主构造函数中有多少个参数,就会依次⽣成对应的component1,component2,component3……这些函数返回的就是对应字段的值
componentN函数是⽤来实现解构申明的
data class User(var id: Int,var name:String)
fun main(args: Array<String>) {
var user: User = User(123, "liuliqianxiao")
var (id,name) = user//多重赋值
print("$id,$name")
}
拿上⾯的例⼦来说,给id赋值,其实调⽤的是userponent1(),给name赋值其实调⽤的是component2()函数。
有了这个解构申明,想在⼀个函数中返回多个结果,就可以申明⼀个简单的数据类来返回了,然后取值也很⽅便。
再来看看copy函数,默认⽣成的copy函数就是⽤现在的数据字段⽣成了⼀个新的对象。
fun copy(id: Int = this.id,name: String = this.name) = User(id,name)
如果只想改变其中的某些字段,就可以在调⽤copy的时候采⽤命名参数的⽅法进⾏调⽤fun main(args: Array<String>) {
var user: User = User(123, "liuliqianxiao")
var other: User = py(name = "mdzz")//只想改变名字
}
data class很好⽤吧,对⽐java,不吹不⿊,怎么说也能节省你⼀些时间的。