kotlin深入1

前言

剛好這段時間沒什麼事,抓緊時間看了下幾個kotlin的開源項目,在這裏做個自我彙總。

1.兼容性

kotlin可以完全兼容Java,以前積累的Java庫和Java世界很好用的開源框架,比如retrofit,rxjava,dagger,butterknife可以直接拿過來用。所以有信心的話可以考慮新項目直接從kotlin開發,當然項目評估的時候,要注意時間,畢竟新語言剛開始用的不會像Java那麼熟練

2.開發工具

Android的話可以用AS3.0(注意還不是穩定版),其實AS3.0又增強了不少,比如:Android Profiler, Mobile File Explorer, 所以我現在開發Java項目也會直接用AS3.0。

3.標準模板

3.1 gradle-wrapper.properties

#Mon Jun 05 10:00:54 CST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#注意要使用gradle-4.0,可以使用default,也可以下載下來
distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-milestone-1-all.zip

3.2 工程根目錄的build.gradle

uildscript {
    ext.kotlin_version = '1.1.2-4'//最新版本號
//    ext.kotlin_version = '1.1.2'
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com'//AS 3.0一定要加
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-alpha3'//最新版本
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

3.3 module的build.gradle

比如一個android library module的配置如下

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    ...
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"//這裏上面已經有定義
}

4.使用anko

Anko是kotlin開源的一個工具庫,可以加快和簡化安卓開發,值得去關注和研究。

5.一些心得

5.1 寫一個工具庫

使用object就可以了,比如:

object JsonUtils {
    @Throws(IOException::class)
    fun readNullSafeString(reader: JsonReader): String? {
        if (reader.peek() == JsonToken.NULL) {
            reader.nextNull()
            return null
        } else {
            return reader.nextString()
        }
    }
}
//使用方式
JsonUtils.readNullSafeString(...)

5.2 使用by代理接口

當一個類實現一個接口,需要實現接口中的方法,有些時候你想把接口交給別的類代理去做,寫法:

class A(private var edit: EditableImpl):Editable by edit{}
//使用基礎構造函數中的edit來代理Editable接口。

5.3 top-level函數的使用

因爲kotlin可以定義top-level函數,比如:

//example.kt
package com.sherchen.example

fun print(){}

在其他地方可以直接使用

//demo.kt
package com.sherchen.example

class Test(){
    fun test(){
        print()
    }
}

這點像java的static import 但是kotlin不需要import,更像是C/C++的函數(非類的成員函數)

5.4 必須熟悉lambda和閉包

因爲kotlin代碼中無處不在的lambda和閉包,包括Standard庫中的apply,also,with等等函數都使用了大量閉包,所以如果要想玩轉kotlin,必須熟悉和熟練使用閉包,比如:

//閉包你可以理解爲設計模式中的模板方法和命令模式,非常好用。
inline fun <T : Child, R> T.use(block: (T) -> R): R {
    var done = false
    try {
        return block(this)
    } catch (e: Exception) {
        done = true
        this.done()
        throw e
    } finally {
        if (!done) {
            this.done()
        }
    }
}

5.5 定義Entity類

有時候需要定義一個數據類解析服務端返回的數據,而kotlin專門提供了data class來做,爲什麼不用呢,比如:

 data class FuckGoods(
    val _id: String,
    val createdAt: String,
    val desc: String,
    val images: Array<String>,
    val publishedAt: String,
    val source: String,
    val type: String,
    val url: String,
    val used: Boolean,
    val who: String

){
    fun hasImg():Boolean {
        return images != null
    }
    fun create() = createdAt.substring(0,10)

}

5.6類型使用

Kclass<T> == T::class
Class<T> == T::class.java

5.7 Nested Class和Inner Class

在Java中沒有區分,但是在kotlin中要注意

class A {
    private var a:Int? = null
    class B{//Nested Class
    }
}

class A {
    private var a:Int? = null
    inner class B {//Inner class
        fun test(){
            //所以內部類可以直接訪問外部類的成員。
            print(a)
        }
    }
}

inner classs的特點是:擁有外部類對象的引用,所以可以訪問外部類的成員。
NOTE:因爲內部類擁有外部類對象的引用,所以需要注意內存泄漏的問題

5.8 使用lateinit

因爲在kotlin中,屬性必須初始化,比如

class A{
    private var a: Int? = null
}

但是有時候,我們需要等會兒再初始化(這跟Java不一定,因爲Java有默認值,所以屬性不需要強制初始化),比如: 寫Test,使用@Inject
比如使用dagger時,@Inject

@Inject lateinit var mPresenter : RandomPresenter

比如使用Butterknife

@BindView(R2.id.title)
lateinit var title: TextView

5.9 注意使用構造函數

可以有兩種選擇,基礎構造函數和第二級構造函數。但是需要注意基礎構造函數只能定義參數列表,要做初始化的操作,可以用

init {//這裏做初始化操作
}

第二級構造函數就和Java的差不多了。

5.10 拋出異常。

    @Throws(IOException::class)
    override fun write(writer: JsonWriter, value: Country) {
        throw UnsupportedOperationException()
    }

最後

我彙總了比較實用的kotlin開源項目,方便以後查閱,在閱讀過程中加了一些註釋,代碼地址:MyKotlins

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章