首頁  >  文章  >  後端開發  >  詳解Kotlin中如何實作類似Java或C#中的靜態方法

詳解Kotlin中如何實作類似Java或C#中的靜態方法

黄舟
黄舟原創
2017-06-04 09:41:351845瀏覽

Kotlin中如何實作類似Java或C#中的靜態方法,本文總結了幾種方法,分別是:套件層級函數、伴生物件、擴充函數和物件宣告。這需要大家根據不同的情況來選擇。

大家可以在網路上搜到不少這樣的文章,官方推薦是包級函數,也有人說用伴生對象(companion class)。這些都是不錯的選擇,但並不完善,我們在不同的情況下有更好的選擇。我總結了幾種方法,分別是:包級函數、伴生物件、擴展函數和物件聲明。這需要大家根據不同的情況來選擇。

一、套件級函數

Kotlin和Java及C#不同的是,可以在套件裡面直接宣告函數##​​#。做法和類別中是一樣的,這裡就不多說了,的確是一個非常好的選擇。適用於函數不需要不包內部的類別進行資料共享的方法。

二、伴生物件

從語意上來講,伴生函數與Java中靜態方法最為相近,所以用伴生物件完全可以實現Java中靜態類的所有內容。但在Java中使用靜態方法有時是沒有辦法的選擇,在Kotlin中伴生物件只是我們的選擇。下面我就介紹一下伴生對象。

大家在使用Java的時不知有沒有註意到,Java類別中的靜態
變數及方法是在什麼時候初始化的?是在靜態方法第一次呼叫時還是在對應的Java類別被載入時?答案是在Java類別被載入時(也就是說如果你呼叫過Java類別中的實例變數及方法後,即使你沒有使用靜態變數及方法,靜態變數已經初始化了)。這種現像用伴生來描述是不是很貼切。

在Kotlin中,認為一個類別中有兩類東東,一類是Java類別中的實例變數及方法,另一類別是Java類別中的靜態變數及方法。 Kotlin將靜態實例及方法統一打包到一個伴生類別中,就是這個樣子啦。下面給一個例子:

fun main(args: Array<String>) {
 Books.getBestSellers()
}
class Books(var name: String, val page: Int) {
  fun getWordCount()=page*100
  companion object ComBooks{
    var bestSellers=arrayOf("Harry Potter\r\t","Lord of the Rings\r\t")
    fun getBestSellers() {
      bestSellers.forEach{v->println(v)}
    }
  }
}

伴生類別是用companion來宣告的,他在伴生物件所在的類別被加載,伴生物件被初始化,與Java靜態成員一樣。其可以匿名或與包含他的類別類別名稱相同。呼叫有兩種:

Books.ComBooks.getBestSellsers()?Books.getBestSellsers()?。

三、擴充函數

在Java中,我們常用寫Utils類,這些類別往往都是針對某一個物件對其功能進行與自身程式相符的操作。其中的方法以靜態方法居多,比方說:

public class Utils {

  public static boolean isEmpty(String string){
    return string != null && string.length() == 0;
  }

  public static boolean isWeakEmpty(String string){
    return isEmpty(string) && string.trim().length() == 0;
  }
}

我們當然可以用上面的兩種方法來實作這些靜態方法,但是我們有更好的方法。

fun String.isEmpty() = this != null && this.length == 0;

fun String.isWeakEmpty()= this.isEmpty() && this.trim().length == 0

上面兩行程式碼給String這個類別擴展了兩個函數,這兩個函數就可以像其原生函數一樣調用,程式碼十分優美。其實擴充函數並沒有修改String類別內部的東東,也只是為String加了兩個靜態函數,但相較於Java的Utils類,可讀性有了非常大的提升。


四、物件宣告

繼續考慮上面的Utils類,這個類別中所有的方法(有時也有可能有變數)都是靜態的,這個方法根本沒有必要實例化,在Java中我們經常將此種類聲明為靜態類,在Kotlin中針對這種情況有沒有好的對應方案呢?有沒有比伴生對象更好的方案呢?當然是有的,對象聲明就是一種。


對象宣告非常好理解,就是用object關鍵字宣告了一個對象,物件裡面可以用變數也可以有方法,如:

object AppInfo{
  var AppName = "Kotlin Message"
  var AppAuthor = "Riley Ge"
  fun toSimpleString() {
    println("AppName:$AppName,AppAuthor:$AppAuthor") 
  }
}

發現Kotlin的對象真是強大!有一點大家注意一下,AppInfo是在第一次被訪問到時延遲初始化的,也就是說在物件聲明時AppInfo並沒有初始化。


五、總結

說了這麼多方法,現在沒有人在擔心Kotlin沒有靜態方法了吧,Kotlin沒有隻是因為他可以做的更好。而且Kotlin也給了大家更多的選擇,大家可以依照自己的實際狀況選用合適的方法,讓自己的程式碼有效率又優美。


以上是詳解Kotlin中如何實作類似Java或C#中的靜態方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn