1. 程式人生 > >Kotlin之頂層函式和屬性

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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!