Android開(kāi)發(fā)Kotlin?DSL使用技巧掌握
前言
在這篇文章中,我們將學(xué)習(xí)如何在您的 Android 項(xiàng)目中編寫(xiě) Kotlin DSL。
這個(gè)文章會(huì)很長(zhǎng),所以花點(diǎn)時(shí)間,讓我們一起來(lái)寫(xiě)你的 DSL。我們將討論以下主題,
- 什么是簡(jiǎn)單英語(yǔ)中的 DSL?
- 您使用任何 DSL 嗎?
- 為什么我們使用 DSL?
- 我們?nèi)绾尉帉?xiě)自己的 DSL
- 基本示例說(shuō)明。
那么讓我們開(kāi)始吧。
什么是 DSL?
維基百科的定義說(shuō),
領(lǐng)域特定語(yǔ)言( DSL) 是專門(mén)針對(duì)特定應(yīng)用領(lǐng)域的計(jì)算機(jī)語(yǔ)言。這與廣泛適用于跨領(lǐng)域的通用語(yǔ)言(GPL)形成對(duì)比。
喜歡認(rèn)真嗎?
一般而言,DSL 為您提供了任何特定語(yǔ)言的靈活工具,以利用特定編程語(yǔ)言提供的功能。
您使用任何 DSL 嗎?
如果您是一名 android 開(kāi)發(fā)人員并且在您的項(xiàng)目中使用 kotlin,您可能會(huì)有意或無(wú)意地在您的項(xiàng)目中使用 DSL?你能想出一個(gè)例子嗎?
讓我?guī)湍悖阌袥](méi)有寫(xiě)過(guò)類似的代碼,
yourlist.forEach { //your code is here }
上面的例子是在 Kotlin 的列表中使用forEach。forEach is kotlin 是 DSL 的一個(gè)例子
為什么我們使用 DSL?
我們應(yīng)該使用 DSL 來(lái)簡(jiǎn)化和提高應(yīng)用程序的復(fù)雜性,并使代碼更具可讀性。
我們?nèi)绾尉帉?xiě)自己的 DSL?
在開(kāi)始編寫(xiě)我們自己的 DSL 之前,我們需要了解帶有接收器的 lambda。
但也讓我簡(jiǎn)要概述一下 lambda with receiver
假設(shè)我們有一個(gè)函數(shù) buildString,
fun buildString(action: (StringBuilder).() -> Unit): String { val stringBuilder = StringBuilder() action(stringBuilder) return stringBuilder.toString() }
在這里,我們有一個(gè)函數(shù)buildString,它將動(dòng)作(它是一個(gè)函數(shù))作為參數(shù)。此處的action函數(shù)以StringBuilder作為參數(shù),函數(shù)buildString以 String 作為返回類型。
現(xiàn)在,要使用我們編寫(xiě)的buildString ,
buildString { append("<") append("MindOrks") append(">") }
我們?cè)谶@里使用 Kotlin 的屬性來(lái)傳遞與 StringBuilder 相關(guān)的屬性,因?yàn)槲覀冊(cè)?strong>buildString函數(shù)中使用了擴(kuò)展函數(shù)的強(qiáng)大功能。
我們還可以使用創(chuàng)建自定義 DSL,
中綴
在 Kotlin 中,中綴幫助我們創(chuàng)建自定義 DSL,類似于我們用英語(yǔ)編寫(xiě)的方式。例如,
在英語(yǔ)中,我們說(shuō)“1加2”來(lái)求和或求差,我們說(shuō)“1減2”。使用中綴調(diào)用可以在 Kotin 中實(shí)現(xiàn)類似的事情。
為了創(chuàng)建一個(gè)中綴來(lái)添加我們使用的數(shù)字,
infix fun Int.plus(number: Int) = this + number
在這里,我們創(chuàng)建了一個(gè) Int 的擴(kuò)展函數(shù),加上它接受一個(gè)數(shù)字并返回這個(gè) + 數(shù)字的總和。這是應(yīng)用函數(shù)的數(shù)字。
所以,要使用我們使用的這個(gè)中綴函數(shù),
val output = 1 plus 2
在上面的代碼中,我們使用我們創(chuàng)建加號(hào)的中綴函數(shù)來(lái)生成輸出。當(dāng)我們?cè)?Logcat 中打印它時(shí),它會(huì)打印3作為總和。
這是因?yàn)槲覀儎?chuàng)建了一個(gè)中綴擴(kuò)展函數(shù)來(lái)使用加號(hào)文本代替“ + ”,我們將其用作傳統(tǒng)方式。
同樣,如果我們想讓中綴函數(shù)減號(hào),我們使用
infix fun Int.minus(number: Int) = this - number
為了使用它,我們使用,
val output = 1 minus 2
中綴使代碼具有可讀性并且非常有序,任何人都可以閱讀。因此,如果任何對(duì)編程一無(wú)所知的人也可以說(shuō)這是對(duì)兩個(gè)數(shù)字進(jìn)行加法或減法。
調(diào)用
在調(diào)用中,運(yùn)算符允許將任何對(duì)象作為函數(shù)調(diào)用。在這里,讓我們創(chuàng)建一個(gè)名為Student的類,
class Student { operator fun invoke(student: Student.() -> Unit) = student fun addName(name: String) { //implementation } fun addMarks(marks: Int) { //implementation } }
在類中,我們創(chuàng)建了一個(gè)函數(shù)調(diào)用,它接受一個(gè)學(xué)生類型的參數(shù)并返回學(xué)生本身。所以,這里我們可以在student本身的對(duì)象中使用Student類的所有方法。
現(xiàn)在,要使用 Class,我們?nèi)匀粫?huì)像在 Kotlin 中一樣創(chuàng)建對(duì)象,
val student = Student()
現(xiàn)在你可以看到我們有另一個(gè)函數(shù)叫做addName 和addMarks**我們將把它用作 DSL。但是,在這里我們可以以兩種不同的方式使用它。兩者如下,
- 類型 - 1(傳統(tǒng)方式)
student.addName("MindOrks") student.addMarks(100)
上面的代碼就像我們以前在 Android 中做的舊的傳統(tǒng)方式。2.DSL方式
student { addName("MindOrks") addMarks(100) }
在這里,我們使用 Kotlin DSL。如果你注意到了,我們有類似的 lambda,
Student.() -> Unit
如果你注意到了,我們?cè)谀抢镉幸粋€(gè).()。它指定 lambda 有一個(gè)接收器,要使用它,我們需要?jiǎng)?chuàng)建一個(gè)類的構(gòu)造。這就是您可以使用調(diào)用來(lái)創(chuàng)建 DSL 的方式。
通過(guò)以上方式,您可以在 Kotlin 中創(chuàng)建您贏得的 DSL。
現(xiàn)在,讓我們討論 Android 中 DSL 的用例和示例。
- 數(shù)據(jù)類
在此,讓我們討論如何創(chuàng)建數(shù)據(jù)類的 DSL??紤]我們有一個(gè)數(shù)據(jù)類 Student
data class Student( var name: String? = null, var age: Int? = null, var marks: Int? = null )
在此,如果我們使用我們編寫(xiě)的數(shù)據(jù)類,
val student = Student( "MindOrks", 20, 30 )
現(xiàn)在要在 DSL 中轉(zhuǎn)換上述代碼,
現(xiàn)在我們將創(chuàng)建一個(gè)新的 lambda,如下所示,
fun student(student: Student.() -> Unit): Student = Student().apply(student)
在上面的代碼中,
我們有一個(gè)接收器,參數(shù)為 student 并將其用作我們使用的 DSL,
val student = student { name = "MindOrks" age = 20 marks = 30 }
這就是我們可以將數(shù)據(jù)類轉(zhuǎn)換為 DSL 的方法。
- UI 元素
為此,讓我們將 textView 視為 UI 元素。在那,我們使用如下,
textView.text = "MindOrks" textView.setOnClickListener { } textView.setTextColor(Color.BLACK)
但是要通過(guò)我們使用的 DSL 使用它,
textView.apply { text = "MindOrks" setOnClickListener { } textColor(Color.BLACK) }
我們使用apply在任何 UI元素中創(chuàng)建 DSL。
- JSON
在我們使用的 Android 中創(chuàng)建 JSON,
val jsonObject = JSONObject() jsonObject.put("name","MindOrks") jsonObject.put("age",20)
這是創(chuàng)建 JSON 對(duì)象的傳統(tǒng)方式。
現(xiàn)在,讓我們看看如何創(chuàng)建 DSL 來(lái)創(chuàng)建 JSON。首先,我們將創(chuàng)建一個(gè)類并使用 JSONObject() 對(duì)其進(jìn)行擴(kuò)展,
class Json() : JSONObject() { }
現(xiàn)在,我們將使用帶有接收器的 lambda 構(gòu)造函數(shù)
constructor(json: Json.() -> Unit) : this() { this.init() }
將使用中綴創(chuàng)建一個(gè)泛型來(lái)向 JSON 對(duì)象添加值。
看起來(lái)像,
infix fun <T> String.to(value: T) { put(this, value) }
在這里,它將使用字符串鍵放置值,而值將使用“ to”的類型。
現(xiàn)在,完整的類文件看起來(lái)像,
class Json() : JSONObject() { constructor(json: Json.() -> Unit) : this() { this.json() } infix fun <T> String.to(value: T) { put(this, value) } } //為了在 Activity 文件中使用它,我們使用剛剛創(chuàng)建的 DSL 創(chuàng)建 JSON, val json = Json { "name" to "MindOrks" "age" to 20 }
這里,
- to是我們?yōu)閷⒅捣湃?JSON 對(duì)象而創(chuàng)建的中綴。
- JSON 是我們創(chuàng)建的類,它使用鍵和值來(lái)創(chuàng)建 JSON 對(duì)象。
當(dāng)我們?cè)?Logcat 中打印它時(shí),我們得到以下輸出,
{"name":"MindOrks","age":20}
這就是您可以在 kotlin 代碼中創(chuàng)建 DSL 的方式。
翻譯鏈接
https://blog.mindorks.com/mastering-kotlin-dsl-in-android-step-by-step-guide
以上就是Android開(kāi)發(fā)Kotlin DSL使用技巧掌握的詳細(xì)內(nèi)容,更多關(guān)于Android開(kāi)發(fā)Kotlin DSL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 實(shí)現(xiàn)關(guān)機(jī)的多種方式
有段時(shí)間做系統(tǒng)hook時(shí)需要用到系統(tǒng)重啟,找了幾種重啟的方法,還有幾種關(guān)機(jī)的方法,總結(jié)一下,有此需求的同學(xué)可以選擇適合自己的方式2021-05-05Android自定義控件ViewGroup實(shí)現(xiàn)標(biāo)簽云
這篇文章主要為大家詳細(xì)介紹了Android自定義控件ViewGroup實(shí)現(xiàn)標(biāo)簽云,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android掃描二維碼時(shí)出現(xiàn)用戶禁止權(quán)限報(bào)錯(cuò)問(wèn)題解決辦法
這篇文章主要介紹了Android掃描二維碼時(shí)出現(xiàn)用戶禁止權(quán)限報(bào)錯(cuò)問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-06-06Android開(kāi)發(fā)實(shí)現(xiàn)的IntentUtil跳轉(zhuǎn)多功能工具類【包含視頻、音頻、圖片、攝像頭等操作功能】
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)的IntentUtil跳轉(zhuǎn)多功能工具類,該封裝類還包含視頻、音頻、圖片、攝像頭等操作功能,需要的朋友可以參考下2017-11-11Android網(wǎng)絡(luò)請(qǐng)求庫(kù)android-async-http介紹
這篇文章主要介紹了Android網(wǎng)絡(luò)請(qǐng)求庫(kù)android-async-http介紹,本文講解了android-async-http的概念、特征以及使用實(shí)例,需要的朋友可以參考下2015-06-06Android Studio 新手入門(mén)教程(一)基本設(shè)置圖解
這篇文章主要介紹了Android Studio 新手入門(mén)教程(一)基本設(shè)置圖解,需要的朋友可以參考下2017-12-12Android使用Spinner實(shí)現(xiàn)城市級(jí)聯(lián)下拉框
這篇文章主要為大家詳細(xì)介紹了Android使用Spinner實(shí)現(xiàn)城市級(jí)聯(lián)下拉框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12一個(gè)吸頂Item的簡(jiǎn)單實(shí)現(xiàn)方法分享
這篇文章主要給大家介紹了一個(gè)吸頂Item的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Android星級(jí)評(píng)分條控件RatingBar使用詳解
這篇文章主要為大家詳細(xì)介紹了Android星級(jí)評(píng)分條控件RatingBar的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06