[Kotlin]擺脫靜態公用程式類別:頂層函式和屬性


Posted by Limon on 2024-12-17

Java作為一種物件導向的語言,要求所有的程式碼都寫成類別的方法。通常情況下,這樣做效果很好;但實際上,幾乎每個大型專案最終都會產生大量不明確屬於任何單一類別的程式碼。有時,一個操作涉及兩個不同類別的對象,而這兩個類別對其起著同等重要的作用。有時有一個主要對象,但您不想透過將操作添加為實例方法來使其 API 膨脹。

結果,您最終得到的類別不包含任何狀態或任何實例方法,並且充當一堆靜態方法的容器。一個完美的例子是 JDK 中的 Collections 類別。若要在您自己的程式碼中尋找其他範例,請尋找名稱中包含 Util 的類別。

在 Kotlin 中,您不需要創建所有那些無意義的類別。相反,您可以將函數直接放置在來源檔案的頂層,任何類別之外。這些函數仍然是在檔案頂部聲明的套件的成員,如果你想從其他套件呼叫它們,你仍然需要匯入它們,但不必要的額外巢狀層級不再存在。

我們直接將 joinToString 函數放入 strings 套件中。建立一個名為 join.kt 的文件,其中包含以下內容。

將joinToString()宣告為頂層函式

package strings
fun joinToString(...): String {...}

當編譯該檔案時,會產生一些類,因為JVM只能執行類別中的程式碼。當您只使用 Kotlin 時,您只需要知道這些。但如果您需要從 Java 呼叫這樣的函數,您必須了解它將如何編譯。為了清楚地說明這一點,讓我們來看看編譯為同一個類別的 Java 程式碼:

package strings;
public class JoinKt {
    public static String joinToString(...) { ... }
}

可以看到Kotlin編譯器產生的類別的名稱與包含函數的檔案的名稱相對應。文件中的所有頂層函數都被編譯為該類別的靜態方法。因此,從 Java 呼叫此函數與呼叫任何其他靜態方法一樣簡單:

import strings.JoinKt;
...
JoinKt.joinToString(list, ", ", "", "");

更改檔案類別名

若要變更包含 Kotlin 頂層函數的生成類別的名稱,請在檔案中新增 @JvmName 註解。將其放在檔案開頭、套件名稱之前:

@file:JvmName("StringFunctions")  //以註解來指定類別名稱
package strings  //套件的敘述跟隨在檔案註解之後
fun joinToString(...): String { ... }

現在可以如下呼叫該函數:

import strings.StringFunctions;
StringFunctions.joinToString(list, ", ", "", "");

稍後第 10 章將詳細討論註釋語法。

頂層屬性

就像函數一樣,屬性可以放置在檔案的頂層。在類別之外儲存單獨的資料並不經常需要,但仍然有用。
例如,您可以使用 var 屬性來計算某些操作已執行的次數:

var opCount = 0   //宣告一個頂層屬性

fun performOperation() {   //更改屬性的值
    opCount++
}

fun reportOperationCount() {   //讀取屬性的值
    println("Operation performed $opCount times")
}

#Kotlin







Related Posts

Gaussian Mixture Model - 詳細推導

Gaussian Mixture Model - 詳細推導

API

API

babel, gulp, webpack 簡介

babel, gulp, webpack 簡介


Comments