頂級(jí)函數(shù)
在Java
中详炬,遇到一段重復(fù)性非常高的代碼又憨。我們會(huì)將其抽離成一個(gè)方法翠霍。這樣的代碼就有比較高的內(nèi)聚。當(dāng)遇到需要變更的時(shí)候蠢莺,只需要變更一處即可寒匙。
public class Main {
public static void main(String[] args) {
sayMessage("aa");
sayMessage("ccc");
}
private static void sayMessage(String message) {
System.out.println("hello:" + message);
}
}
上面的代碼,我們將輸出語句封裝成一個(gè)方法躏将。當(dāng)我們需要更改輸出前綴 hello 的時(shí)候锄弱,只需更改sayMessage
里面的方法。但是祸憋,這里面存在有一個(gè)問題会宪。就是這個(gè)方法只能在Main
這個(gè)類使用。 如果有別的類需要用的話蚯窥。我們就需要將這個(gè)方法單獨(dú)抽離到一個(gè)類中掸鹅。
public class LogUtils {
public static void sayMessage(String message) {
System.out.println("hello:" + message);
}
}
將sayMessage
單獨(dú)抽離在一個(gè)類中塞帐,需要調(diào)用的地方需要引入Logger這個(gè)類,然后調(diào)用即可巍沙。
public class Main {
public static void main(String[] args) {
LogUtils.sayMessage("aa");
LogUtils.sayMessage("ccc");
}
}
好像一些都按照正常的邏輯發(fā)展葵姥,但是我們好像忽略了一些問題。我們只是需要一個(gè)方法sayMessage
為何還需要定義一個(gè)類呢句携?我嘗試著解答這個(gè)問題榔幸,得到了以下結(jié)論
- 增強(qiáng)代碼的內(nèi)聚性。
- 為了迎合
JVM
矮嫉。
當(dāng)我們將方法抽離到一個(gè)類中削咆,就意味著這個(gè)類專門來做這一類的事情。就比如說LogUtils
這個(gè)類專門用來處理輸出相關(guān)的操作蠢笋。這樣的話拨齐,聲明這個(gè)類意義就變得非常的重大。它使得我們的代碼更改聚合了昨寞。
public class LogUtils {
public static void sayMessage(String message) {
System.out.println("hello:" + message);
}
public static void sayErrorMessage(String message) {
System.out.println("error:" + message);
}
}
但是奏黑,更多的代碼我們不能把它歸為一類事物。為了迎合JVM
(JVM
只能執(zhí)行類中的代碼)编矾。我們就強(qiáng)行將它聲明在一個(gè)類中熟史。比如項(xiàng)目中的Utils
。而Kotlin
中的頂級(jí)函數(shù)就是為了處理這個(gè)問題窄俏。
你只需要將函數(shù)放在文件頂層蹂匹。這個(gè)函數(shù)不屬于任何的類。假設(shè)你需要從包外調(diào)用它凹蜈。只需要導(dǎo)入這個(gè)包即可限寞。
package hello.aa.cc.dd.KotlinLearn.chapter_1.hello
fun sayMessage(message:String){
println("hello ${message}")
}
import hello.aa.cc.dd.KotlinLearn.chapter_1.hello.sayMessage
fun main(args: Array<String>) {
sayMessage("hello world");
}
當(dāng)然,Kotlin
是完全兼容Java
代碼的仰坦。那么履植,我們?cè)?code>Java中如何調(diào)用這個(gè)代碼呢?其實(shí)悄晃,Kotlin
內(nèi)部也是聲明了一個(gè)類玫霎。然后將我們所寫的文件名作為 類名。頂級(jí)函數(shù)作為該類的靜態(tài)函數(shù)妈橄。
public final class hello/aa/cc/dd/KotlinLearn/chapter_1/hello/HelloKt {
// access flags 0x19
public final static sayMessage(Ljava/lang/String;)V
@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
L0
假設(shè)我們需要更改默認(rèn)的類名的話需要在文件前面加上
@file:JvmName("LoggerUtils")