Kotlin 類(lèi)5 - Data Class
在 Kotlin 中凌箕,不需要自己動(dòng)手去寫(xiě)一個(gè) JavaBean鸟妙,可以直接使用 DataClass纤勒,使用 DataClass 編譯器會(huì)默默地幫我們生成以下函數(shù)
equals()
hashCode()
toString()
componentN()
copy()
1. data class 的使用
- 定義一個(gè) data class 類(lèi)
data class Country(var id: Int, var name: String, var continent: String)
- 編譯器自動(dòng)實(shí)現(xiàn)的函數(shù)舉例
toString()
var china = Country(0, "中國(guó)", "Asia")
println(china) // Country(id=0, name=中國(guó), continent=Asia)
copy()
var japan = china.copy(id = 1, name = "日本")
println(japan) // Country(id=1, name=日本, continent=Asia)
componentN()
val (id, name, continent) = china
println("$id --> $name赋朦,$continent") // 0 --> 中國(guó)辉川,Asia
2. data class 使用的坑
由于 data class 被編譯器生成 JavaBean 時(shí)诅愚,是一個(gè) final 類(lèi)寒锚,并且沒(méi)有無(wú)參的構(gòu)造函數(shù),所以在使用過(guò)程非常不方便违孝,但是我們可以利用官方給出的插件來(lái)解決這些問(wèn)題(noarg
刹前、allopen
)
1. 在 Android 中使用 Gradle 的做法
- 添加依賴(lài)
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
}
}
- 將依賴(lài)應(yīng)用到項(xiàng)目中
apply plugin: 'kotlin-noarg'
apply plugin: 'kotlin-allopen'
- 創(chuàng)建一個(gè) annotation
package mm.learn.kotlin._001_class.annotations;
annotation class NoArgOpenDataClass
- 添加配置
noArg{
annotation("mm.learn.kotlin._001_class.annotations.NoArgOpenDataClass")
}
allOpen{
annotation("mm.learn.kotlin._001_class.annotations.NoArgOpenDataClass")
}
- 將注解用到 data class 中
@NoArgOpenDataClass
data class Country(var id: Int, var name: String, var continent: String)
- 經(jīng)過(guò)上面5個(gè)步驟,編譯器就會(huì)幫我去掉
final
關(guān)鍵字雌桑,并且生成一個(gè)無(wú)參的構(gòu)造方法喇喉,但是由于是在編譯器做的操作,所以在源代碼中還是無(wú)法直接使用無(wú)參的構(gòu)造函數(shù)校坑,只能通過(guò)反射來(lái)使用拣技。
2. 在后臺(tái)項(xiàng)目中用 Maven
- 在項(xiàng)目目錄中創(chuàng)建一個(gè)注解的目錄
anno
(我的完整包名是mm.tm.jxcos.anno
) - 在該目錄下創(chuàng)建一個(gè)
NoArg
的注解類(lèi)
package mm.tm.jxcos.anno
annotation class NoArg
- 配置
pom.xml
文件,添加noarg
插件(注意標(biāo)簽結(jié)構(gòu)和configuration
標(biāo)簽里面的內(nèi)容)
<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<configuration>
<compilerPlugins>
<!-- spring_kotlin官方插件耍目,為aop代理類(lèi)去final關(guān)鍵字 -->
<plugin>spring</plugin>
<!-- kotlin官方插件膏斤,為被注解的指定類(lèi)添加無(wú)參構(gòu)造方法 -->
<plugin>no-arg</plugin>
</compilerPlugins>
<pluginOptions>
<option>no-arg:annotation=mm.tm.jxcos.anno.NoArg</option>
<!-- 在合成的構(gòu)造函數(shù)中調(diào)用實(shí)例初始化器 -->
<!-- <option>no-arg:invokeInitializers=true</option> -->
</pluginOptions>
</configuration>
</plugin>
</plugins>
</build>
- 在數(shù)據(jù)類(lèi)中使用
package mm.tm.jxcos.domain
import mm.tm.jxcos.anno.NoArg
@NoArg
data class CommIdReq(val id: Int)