Kotlin 類5 - Data Class

Kotlin 類5 - Data Class


在 Kotlin 中,不需要自己動(dòng)手去寫一個(gè) JavaBean,可以直接使用 DataClass,使用 DataClass 編譯器會(huì)默默地幫我們生成以下函數(shù)

equals()
hashCode()
toString()
componentN()
copy()

1. data class 的使用

  1. 定義一個(gè) data class 類
data class Country(var id: Int, var name: String, var continent: String)
  1. 編譯器自動(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 類,并且沒有無(wú)參的構(gòu)造函數(shù),所以在使用過(guò)程非常不方便,但是我們可以利用官方給出的插件來(lái)解決這些問(wèn)題(noargallopen

1. 在 Android 中使用 Gradle 的做法

  1. 添加依賴
buildscript {
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
    }
}
  1. 將依賴應(yīng)用到項(xiàng)目中
apply plugin: 'kotlin-noarg'
apply plugin: 'kotlin-allopen'
  1. 創(chuàng)建一個(gè) annotation
package mm.learn.kotlin._001_class.annotations;

annotation class NoArgOpenDataClass
  1. 添加配置
noArg{
    annotation("mm.learn.kotlin._001_class.annotations.NoArgOpenDataClass")
}

allOpen{
    annotation("mm.learn.kotlin._001_class.annotations.NoArgOpenDataClass")
}
  1. 將注解用到 data class 中
@NoArgOpenDataClass
data class Country(var id: Int, var name: String, var continent: String)
  1. 經(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

  1. 在項(xiàng)目目錄中創(chuàng)建一個(gè)注解的目錄 anno(我的完整包名是 mm.tm.jxcos.anno
  2. 在該目錄下創(chuàng)建一個(gè) NoArg 的注解類
package mm.tm.jxcos.anno


annotation class NoArg
  1. 配置 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代理類去final關(guān)鍵字 -->
                    <plugin>spring</plugin>
                    <!-- kotlin官方插件,為被注解的指定類添加無(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>
  1. 在數(shù)據(jù)類中使用
package mm.tm.jxcos.domain

import mm.tm.jxcos.anno.NoArg

@NoArg
data class CommIdReq(val id: Int)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 人生苦多,快來(lái) Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,686評(píng)論 9 118
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡(jiǎn)書還為我保存起的...
    Jenaral閱讀 3,123評(píng)論 2 9
  • 面向?qū)ο缶幊蹋∣OP) 在前面的章節(jié)中,我們學(xué)習(xí)了Kotlin的語(yǔ)言基礎(chǔ)知識(shí)、類型系統(tǒng)、集合類以及泛型相關(guān)的知識(shí)。...
    Tenderness4閱讀 4,607評(píng)論 1 6
  • 我?guī)е鴦e人的秘密 來(lái)到許多年前的七月 午后驕陽(yáng)似火 在木門紅磚的門口 看見我正和鄰家小孩 泡在巨大的澡盆里 陽(yáng)光直...
    12個(gè)字符閱讀 357評(píng)論 0 0
  • 在生活中,有很多疾病都是由陽(yáng)氣不足造成的,比如癌癥、不孕不育、肥胖、內(nèi)分泌紊亂、腎病等等。 內(nèi)經(jīng)有云:陰成行、陽(yáng)化...
    de7c69bfb64b閱讀 211評(píng)論 0 2

友情鏈接更多精彩內(nèi)容