Kotlin實戰--消除靜態工具類:頂層函數和屬性

1.引入

我們都知道, Java 作爲一門面向對象的語言,需要所有的代碼都寫作類的函數。大多數情況下,這種方式還能行得通。但事實上,幾乎所有的大型項目,最終都有很多的代碼並不能歸屬到任何一個類中。有時一個操作對應兩個不同的類的對象,而且重要性相差無幾。有時存在 一個基本的對象,但你不想通過實例函數來添加操作,讓它的 API 繼續膨脹。結果就是,最終這些類將不包含任何的狀態或者實例函數,而是僅僅作爲一堆靜態函數的容器。在 JDK 中, 最適合的例子應該就是 Collections了。看看你自己的代碼,是不是也有一些類本身就以Util作爲後綴命名。
在kotlin中,根本就不需要去創建這些無意義的類, 相反,可以把這些函數接放到代碼文件的頂層,不用從屬於任何的類。這些放在文件頂層的函數依然是包內的成員,如果你需要從包外訪問它,則需要 import 但不再需要額外包一層。

2.頂層函數

見名知意,原來在Java中,類處於頂層,類包含屬性和方法,在Kotlin中,函數站在了類的位置,我們可以直接把函數放在代碼文件的頂層,讓它不從屬於任何類。就像下面這樣,我們在一個Test.kt文件中寫入如下的Kotlin代碼。

package com.smartcentury.agriculturalmarket.utils

fun getKotlin():String{
    return "Kotlin"
}

現在我們看一下如何在其他包中引用它:

import  com.smartcentury.agriculturalmarket.utils.getKotlin

getKotlin()

我們只需要導入包,然後直接調用就可以了。

但是我們可能會有個疑問,如果我們想要在Java中調用這個方法應該如何調用呢?

在Java中調用Kotlin頂層函數。

要想知道如何在Java中調用頂層函數其實很簡單,我們只要將Kotlin反編譯一下就可以了。下面介紹下如何反編譯Kotlin代碼

第一步:在IDE中打開你需要查看反編譯的代碼文件,然後打開頂部的"Tools",選擇"Kotlin",再選擇"Show Kotlin ByteCode"

在這裏插入圖片描述

第二步:點擊右側“Decompile”
在這裏插入圖片描述

我們會得到另外一個文件

在這裏插入圖片描述

通過以上的代碼可以總結出兩點內容:

  1. 頂層文件會反編譯成一個容器類。(類名一般默認就是頂層文件名+"Kt"後綴,注意容器類名可以自定義)
  2. 頂層函數會反編譯成一個static靜態函數,如代碼中的getKotlin函數

現在我們應該知道如何在java代碼中如何調用了吧。

TestKt.getKotlin();

可能有時候你覺得Kotlin爲你自動生成的這個類名不好,那你可以通過@file:JvmName註解來自定義類名,就像下面這樣。

@file:JvmName("MyKotlin")
package com.smartcentury.agriculturalmarket.utils

/**
 * @Author:         Simon
 * @CreateDate:     2019/5/16 16:04
 * @Description:
 */

fun getKotlin():String{
    return "Kotlin"
}

而且要注意,這個註解必須放在文件的開頭,包名的前面。

於是我們在Java文件中可以這樣調用

MyKotlin.getKotlin();

3.頂層屬性

瞭解了頂層函數,下面再看看頂層屬性。頂層屬性也就是把屬性直接放在文件頂層,不依附於類。我們可以在頂層定義的屬性包括var變量和val常量,就像下面這樣。

@file:JvmName("MyKotlin")
package com.smartcentury.agriculturalmarket.utils

/**
 * @Author:         Simon
 * @CreateDate:     2019/5/16 16:04
 * @Description:
 */


val name:String="kotlin"
var type:String="language"

用法和頂層方法一樣,這裏就不贅述了。

4.寫在最後

頂層屬性和方法可以讓我們的代碼更加簡潔,而且不需要引入多於的類。頂層函數在Kotlin裏面用法也很廣泛,我們最常用的let()方法就是頂層方法。後面會單獨講到Kotlin常用的頂層方法。

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