將APP變成使用100%Kotlin的總結

qn0041 8年前發布 | 60K 次閱讀 Kotlin 安卓開發

我已經關注Kotlin的發展有一段時間了,Kotlin是一個基于 JVM ,兼容 Java 的新的編程語言。隨著Kotlin版本1.0.2的發布,帶來的增量編譯和在標準庫大量減少的方法數量,我開始渴望在項目中使用它。

我是Keepsafe應用鎖app的首席工程師,該app和大多android應用app都是通過java語言開發的。Java有很多現代編程語言的不足的地方,尤其是Android支持Java 7的版本。為了解決這個問題,通常是使用類庫,例如為了lambdas和關閉資源使用Retrolambda,為了不可變集合和有效函數使用Guava,為了view的綁定使用ButterKnife或者為了函數式編程使用ReactiveX。但是,這些類庫也有很多缺點,你依賴的每個類庫給APK添加方法,Retrolambda時常會增量構建失敗。

即使有這些庫,Java代碼也很冗余。在90年代Java的設計者認為,你的代碼要經過大量的設計是個不錯的主意,但今天顯然是不必要的。Kotlin提供了一個經過深思熟慮的語法和廣泛的標準庫,消除許多存在于Java中的痛點。因此,在多天的努力中,我將整個App Lock應用程序鎖定app的代碼轉換成Kotlin。這里是我在轉換過程中的想法和總結。

Kotlin vs Java in App Lock

App Lock 轉換為 Kotlin 后方法的統計。從dexcount gradle這個插件得到的。

通過它的標準庫添加的方法數量,是大家提高轉換成Kotlin關注的地方。由于像support library和GMS這些類庫,會提高許多app在 Dex 方法數量限制 上的風險。在重寫前后,我使用dexcount gradle插件來對方法分解。最終的結果是,總的方法數在proguard之后,從5491變成4987下降了10%(不包括GMS和appcompat的統計)。代碼數從java的12371行變成Kotlin的8564行,減少了30%。

app從Java轉成Kotlin,總的方法數減少了10%,總的代碼行數減少了30%。

方法數減少的結果既是Kotlin本身是一種更加簡潔的語言導致的,同時也證明很多以前在Java中使用質量不錯的庫將不再需要的事實。

Retrolambda

Retrolambda 為每一個添加多個方法的lambda自動生成一個匿名類。Kotlin有用到一個lambda可以無需增加任何額外的方法來內聯方法。

public inline fun <T> T.apply(block: T.() -> Unit): T { 
    block(); return this 
}

例如,非常有用的標準庫函數 應用

通過這種方式調用

myObject.apply { /* modify myObject */ }

你在定義一個lambda函數調用時,沒有匿名類生成,由于這個調用,沒有額外的方法被添加,也沒有發生內存分配。事實上,應用函數本身,就像大多數在Kotlin標準庫內部關聯函數,不會導致一個方法在編譯代碼過程中被添加。

Guava

Guava整體被具有更易于使用的額外優勢的Kotlin標準庫所代替。Big Guava ComparisonChain可以被kotlin.comparisons函數用一些字符代替。

<span style="font-size:18px;">// Guava

    ComparisonChain.start()

    .compareTrueFirst(lhs.isActive(), rhs.isActive())

    .compare(lhs.lastName(), rhs.lastName())

    .compare(lhs.firstName(), rhs.lastName())

    .result();

    //Kotlin

    compareValuesBy(lhs, rhs,

    {it.active},{it.lastName},{it.firstName})</span>

Guava null-safety可選的類在 Kotlin里面被創建

// Guava
return Optional.of(value).or(defaultValue);

// Kotlin
return value ?: defaultValue

Guava的lazy fields和前提條件類也被 Kotlin 的標準庫所代替

<span style="font-size:18px;">// Guava

    private Supplier lazyField = Suppliers.memoize(

    () -> "value");

    public String getField() {

    return lazyField.get();

    }


    // Kotlin

    val field bylazy{"value"}

    // Guava

    Preconditions.checkNotNull(value, "error %s", arg);

    // Kotlin

    checkNotNull(value){"$arg"}</span>

幾乎所有的Guava的集合類都在Kotlin中存在。即便Guava所有的這些功能,整個Kotlin標準庫仍單獨比Guava小。

ButterKnife

ButterKnife依然被用于Kotlin中,但是 Kotlin Android Extensions 提供了一種更加簡潔的方法來綁定view。也存在其他的解決方案如Kotterknife和Anko,但是我發現當前通常的xml布局使用Kotlin Android Extensions是處理view最好的方式。Kotterknife比extensions需要更多的引用。Anko會添加大量的方法,而且它的DSL往往較為復雜并且比XML性能低。

RxJava

RxJava也是非常棒的,我在App Lock的很多地方使用它。但由于Java的Android上并沒有對集合功能的方法,我有時會用RxJava作為替代品。 

Observable.from(collection)
    .filter(it -> it.isActive())
    .map(it -> it.size())
    .reduce((it, sum) -> it + sum)
    .toBlocking().single();

在Kotlin里可以被替換成:

collection.filter { it.isActive() }
          .map { it.size() }
          .reduce { it, sum -> it + sum }

Kotlin入門

如果你已經有一定java基礎,學習Kotlin很容易。你可以通過 Kotlin Koans online 學習,使用 reference documentation 編寫。Jake Wharton也提供了很多 Kotlin有用的語法功能的說明

關于Kotlin最好的一部分是它能夠在Java和Kotlin直接相互調用。所以你并不需要你的整個代碼庫一次轉換。我建議你最開始的時候,從一個重寫的單獨文件開始。IntelliJ具有自動從Java轉換成Kotlin的功能,但是它經常會產生不正確的代碼。因此,更好的做法是從一個草稿開始,直到你對編程語言很熟悉的時候。

一旦你具備一定基礎知識后,我建議選擇一些依賴現有的Java代碼,并將其轉化為Kotlin。像Android上面的fragment的activity的ui代碼是一個很好的實踐的地方。選取一個沒有依賴的類,允許你只關注你的工作代碼,無需擔心任何接口正在發生變化。保持Kotlin的開放,使你可以快速的處理正在編譯時產生的語法或者標準庫相關問題。你也可以開始就選擇Kotlin編寫,來代替把Java轉換成Kotlin。但是我發現從被轉換的代碼選取的不太明顯的語法比試圖從一張白紙弄明白更加容易。大多數情況下,自動轉換是一個不錯的選擇,它出問題的地方通常也很容易解決。

當你正在學習Kotlin時,需要明確目的是避免項目不堪重負。如果你還沒有使用像MVP或者MVVM,不用擔心試圖在同一時間學習。不要擔心找不到可用的Kotlin庫。只關注在你所知道的關于Java和Kotlin轉換的知識。如果您仍然有痛點,那么你可以添加更多的庫或設計模式。

你應該將你的代碼庫一次性替換嗎?

當你在你的代碼庫里面提供了很多Kotlin后,你必須決定是否一次全部轉換成Kotlin,或者把它變得更慢。幸運的是,Kotlin兼容Java,兩者相通。你可以同時將單獨的類轉換,也可以讓兩種語言一起并存運行。

對于大的代碼庫,將所有的轉換成一個正式版本會需要大量的工作量。在Keepsafe主要的app里面,截止至寫這篇文章時,大約15%的代碼是Kotlin.在該應用程序,如果我們不得不明顯更改一個Java類,我們通常會將類轉換為Kotlin,我們也正在為此努力。這讓我們可以穩定的提高代碼庫,而不會在新特性上減慢我們的工作。

但是,如果你的項目足夠小,你可以轉換到100%Kotlin,這是值得考慮的。當你不必維護Java的兼容性,可以簡化您內部API,并刪除了很多我前面談到的庫。您可以將靜態工具類轉換成擴展功能,并采取Kotlin更強的類型推斷的優勢。

最后的思考

Kotlin是一種偉大的編程語言,是對Java的巨大改善。將App Lock轉換成Kotlin,讓app更快,更小,相比之前更少的bug。Kotlin語言現在已經足夠成熟,不管在任何一種工具,語言,或標準庫,沒有重要的功能缺失。如果你想知道現在是否嘗試Kotlin或者你應該等待一段時間,我可以告訴你,現在Kotlin準備在全職生產使用。如果你使用Android或其他Java環境都是Kotlin可能的工作的地方,你應該為自己嘗試一下Kotlin。

 

 

 

來自:http://blog.csdn.net/u011176685/article/details/52673390

 

 本文由用戶 qn0041 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!