Kotlin 套件與引入 (Packages and Imports)

在寫程式時,我們通常會把相關的類別 (Class) 和函式 (Function) 放在同一個資料夾或檔案中整理。 在 Kotlin 中,這個整理的機制稱為 Package (套件)

定義 Package

Package 的宣告必須放在檔案的最上方 (甚至在 import 之前)。 這代表這個檔案中的所有內容 (類別、函式、變數) 都屬於這個 Package。

package com.example.myapp

fun hello() {
    println("Hello from com.example.myapp")
}

class User
目錄結構: 在 Java 中,Package 名稱必須嚴格對應資料夾結構 (例如 com.example 必須放在 com/example 資料夾)。 但在 Kotlin 中,這 不是強制的。你可以把 package com.example 放在任何資料夾中。 不過為了專案整潔,強烈建議還是維持資料夾結構與 Package 一致

匯入 (Imports)

如果你要使用其他 Package 的類別或函式,必須使用 import 關鍵字將其匯入。

import android.widget.TextView // 匯入特定類別
import android.view.*          // 匯入該 Package 下的所有內容 (不推薦,建議明確匯入)

匯入 Top-level 函式與屬性

Kotlin 允許函式不一定要寫在 Class 裡面 (Top-level)。這些函式也可以直接被 import。

// Utils.kt
package com.demo
fun add(a: Int, b: Int) = a + b

// Main.kt
import com.demo.add

fun main() {
    println(add(1, 2)) // 直接呼叫 add,不用 Utils.add
}

預設匯入 (Default Imports)

Kotlin 為了方便,預設會自動幫你匯入一些常用的 Package,你 不需要手動 import 它們:

  • kotlin.* (包含 Any, Int, String, List 等基本型別)
  • kotlin.annotation.*
  • kotlin.collections.* (包含 listOf, mapOf 等)
  • kotlin.comparisons.*
  • kotlin.io.* (包含 println, print 等)
  • kotlin.ranges.*
  • kotlin.sequences.*
  • kotlin.text.*

以及 JVM 平台特定的:

  • java.lang.*
  • kotlin.jvm.*

匯入別名 (Import Aliases)

如果你的程式中剛好要用到兩個不同 Package 但 名稱相同 的類別 (例如 java.util.Datejava.sql.Date),該怎麼辦?

Kotlin 提供了一個很棒的功能:as (別名)

import java.util.Date
import java.sql.Date as SqlDate // 幫它取個新名字

fun transform(date: Date): SqlDate {
    // ...
}

這樣程式碼就清楚多了,不用在程式碼中寫落落長的完整 Package路徑 (java.sql.Date)。