Kotlin之頂層函式和屬性
今天一起來看看Kotlin中的頂層函式和屬性。
遇到的問題
我們都知道,Java中,所有的程式碼都是依託於類而存在,我們所謂的函式作為類的方法,我們所謂的屬性作為類的屬性。但是在有些情況下,我們發現有些方法可能不是屬於某一個特定類,有些屬性也不是屬於某一個特定的類。所以我們就建立了很多的Java工具類和屬性的常量類,就像下面這樣。
Java程式碼
public class Constant {
public static final String BASE_URL = "http://www.xxx.top:8080";
}
public class StrUtil {
public static String joinToStr(Collection<String> collection){
//...
return "";
}
}
其實上面的類只是為了承載我們的靜態屬性和方法,作為了靜態方法和屬性的容器,這就是我們目前遇到的問題,一大堆無用的容器類,那讓我們看看Kotlin中是如何處理這個問題的。
頂層函式
見名知意,原來在Java中,類處於頂層,類包含屬性和方法,在Kotlin中,函式站在了類的位置,我們可以直接把函式放在程式碼檔案的頂層,讓它不從屬於任何類。就像下面這樣,我們在一個Str.kt檔案中寫入如下的Kotlin程式碼。
Kotlin程式碼
package util
fun joinToStr(collection: Collection<String>): String{
//....
return "";
}
請注意,我們把它放在了util包中,這在我們厚密啊呼叫這個類時非常重要。
讓我們現來看看在另一個Kotlin類中怎麼呼叫。
Kotlin程式碼
import util.joinToStr
fun main(args: Array<String>){
joinToStr(collection = listOf("123", "456"))
}
看到了嗎?我們可以通過import 包名.函式名來匯入我們將要使用的函式,然後就可以直接使用了,是不是超級方便。那我們再來看看在Java中如何呼叫上面的方法。
Java程式碼
import java.util.ArrayList;
import util.StrKt;
public class Main {
public static void main(String[] args) {
StrKt.joinToStr(new ArrayList<>());
}
}
因為在Java中,類還是必須要存在的,所以編譯器將Str.kt檔案裡的程式碼放在了一個StrKt的類中,然後把我們定義的Kotlin的函式作為靜態方法放在其中,所以在Java中是先通過mport匯入這個類,然後通過類名.方法名來呼叫。
可能有時候你覺得Kotlin為你自動生成的這個類名不好,那你可以通過@file:JvmName註解來自定義類名,就像下面這樣。
@file:JvmName("StrUtil")
package util
fun joinToStr(collection: Collection<String>): String{
//....
return "";
}
而且要注意,這個註解必須放在檔案的開頭,包名的前面。
在Java中匯入類和呼叫的時候就要使用我們自定義的類名來進行操作了,就像這樣。
import java.util.ArrayList;
import util.StrUtil;
public class Main {
public static void main(String[] args) {
StrUtil.joinToStr(new ArrayList<>());
}
}
頂層屬性
瞭解了頂層函式,下面再看看頂層屬性。頂層屬性也就是把屬性直接放在檔案頂層,不依附於類。我們可以在頂層定義的屬性包括var變數和val常量,就像下面這樣。
Kotlin程式碼
package config
var count = 0
val REQUEST_URL = "http://localhost:8080/"
const val BASE_URL = "http://www.xxx.top/"
這裡我定義了三個頂層屬性,可能有些地方你還不太能看得懂,不急,我們先看看在Kotlin和Java中怎麼用,然後我們再理解。
在Kotlin中使用
import config.count
fun main(args: Array<String>){
//使用var變數
count++
//使用val常量
config.REQUEST_URL
//使用const val常量
config.BASE_URL
}
你會發現在Kotlin中只要匯入就可以直接使用了,與頂層屬性的使用是一樣的。
在Java中使用
import config.ApiConfigKt;
public class Main {
public static void main(String[] args) {
//使用var變數
ApiConfigKt.setCount(12);
System.out.println(ApiConfigKt.getCount());
//使用val常量
System.out.println(ApiConfigKt.getREQUEST_URL());
//使用const val常量
System.out.println(ApiConfigKt.BASE_URL);
}
}
首先匯入是肯定的,通過類名類呼叫這個也和頂層函式裡面的規則一致。然後你會發現Kotlin為var變數生成了get和set方法,然後為val常量生成了get方法,最後我們的const val常量則等同於Java的public static final常量,可以直接通過類名.常量名來呼叫。
寫在最後
Kotlin中通過使用頂層函式和頂層屬性幫助我們消除了Java中常見的靜態工具類,使我們的程式碼更加整潔,值得一試。
---------------------
作者:codekongs
來源:CSDN
原文:https://blog.csdn.net/bingjianIT/article/details/79134670
版權宣告:本文為博主原創文章,轉載請附上博文連結!