kotlin学习之函数(二)
生活随笔
收集整理的這篇文章主要介紹了
kotlin学习之函数(二)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
- 1. 頂層函數(shù)和屬性
- 2. 擴展函數(shù)
- 3. 擴展屬性
- 4. 局部函數(shù)
這一節(jié)主要介紹頂層函數(shù)和屬性,擴展函數(shù)和屬性的原理,理解它們與Java的區(qū)別,并提出局部函數(shù)的概念
1. 頂層函數(shù)和屬性
頂層函數(shù)不屬于任何類,可以理解成Java的靜態(tài)函數(shù)
//在Join.kt文件中 package stringsfun joinToString(...): String { ... }const val UNIX_LINE_SEPARATOR = "\n"相當于Java代碼中的
package strings; public class JoinKt {public static String joinToString(...) { ... }public static final String UNIX_LINE_SEPARATOR = "\n"; }2. 擴展函數(shù)
//ExtendsionTextView.kt文件中 //擴展函數(shù)定義 fun TextView.isBold() = this.apply { paint.isFakeBoldText = true }//擴展函數(shù)調(diào)用 activity.find<TextView>(R.id.course_comment_tv_score).isBold()等同于下面的 Java 代碼:
public final class ExtendsionTextViewKt {//這個類名就是頂層文件名+“Kt”后綴,這個知識上篇博客有詳細介紹public static final TextView isBold(@NotNull TextView $receiver) {//擴展函數(shù)isBold對應(yīng)實際上是Java中的靜態(tài)函數(shù),并且傳入一個接收者類型對象作為參數(shù)Intrinsics.checkParameterIsNotNull($receiver, "$receiver");$receiver.getPaint().setFakeBoldText(true);//設(shè)置加粗return $receiver;//最后返回這個接收者對象自身,以致于我們在Kotlin中完全可以使用this替代接收者對象或者直接不寫。} }實際上就是一個靜態(tài)函數(shù),靜態(tài)函數(shù)參數(shù)是接受者類型的對象,利用這個對象就可以訪問這個對象里面的所有東西,所以相當于擴展了,擴展屬性是怎么實現(xiàn)的呢?各位可以先思考一下,再看下面。
3. 擴展屬性
//ExtendsionTextView.kt文件中 //擴展屬性定義 var TextView.isBolder: Booleanget() {//必須定義get()方法,因為不能在現(xiàn)有對象添加字段,也自然就沒有了默認的get()實現(xiàn)return this.paint.isFakeBoldText}set(value) {this.paint.isFakeBoldText = true} //擴展屬性調(diào)用 activity.find<TextView>(R.id.course_comment_tv_score).isBolder = true等同于下面的 Java 代碼:
public final class ExtendsionTextViewKt {//get()方法所對應(yīng)生成靜態(tài)函數(shù),并且傳入一個接收者類型對象作為參數(shù)public static final boolean isBolder(@NotNull TextView $receiver) {Intrinsics.checkParameterIsNotNull($receiver, "$receiver");return $receiver.getPaint().isFakeBoldText();}//set()方法所對應(yīng)生成靜態(tài)函數(shù),并且傳入一個接收者類型對象作為參數(shù)和一個需要set的參數(shù)public static final void setBolder(@NotNull TextView $receiver, boolean value) {Intrinsics.checkParameterIsNotNull($receiver, "$receiver");$receiver.getPaint().setFakeBoldText(true);} }其實就是在get和set方法中加入了接受者類型的對象,利用這個對象就可以訪問這個對象里面的所有東西
但是以為擴展函數(shù)和屬性是靜態(tài)的,所以是不能夠重寫的
4. 局部函數(shù)
class User(val id: Int, val name: String, val address: String)fun saveUser(user: User) {if (user.name.isEmpty()) {throw IllegalArgumentException("用戶名為空不能保存")}if (user.address.isEmpty()) {throw IllegalArgumentException("用戶地址為空不能保存")}//保存user }把其中檢驗字段的代碼整個成一個驗證的局部函數(shù)
fun saveUser(user: User) {fun validate(value: String, fieldName: String) {if (value.isEmpty()) {throw IllegalArgumentException("用戶${user.fieldName} 為空不能保存") //局部函數(shù)能訪問外部函數(shù)的user對象}}validate(user.name, "名")validate( user.address, "地址")//保存user}當然,你也可以用將這段局部函數(shù)直接放進擴展函數(shù)中
fun User.validateBeforeSave() {fun validate(value: String, fieldName: String) {if (value.isEmpty()) {throw IllegalArgumentException("用戶$fieldName 為空不能保存")}}validate(name, "名")validate(address, "地址")}fun saveUser(user: User) {user.validateBeforeSave()//保存user}總結(jié)
以上是生活随笔為你收集整理的kotlin学习之函数(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kotlin学习之基础(一)
- 下一篇: kotlin学习之类(三)