Kotlin 可見性修飾子 (Visibility Modifiers)
在 Kotlin 中,我們使用修飾子來控制類別、方法或屬性的可見範圍。
與 Java 最大的不同點在於:預設是 public,且多了一個 internal 修飾子。
四種修飾子
| 修飾子 | 說明 |
|---|---|
public | (預設) 隨處可見。 |
private | 只在定義它的類別或檔案內可見。 |
protected | 在類別內及其子類別可見 (注意:不能用於 Top-level 宣告)。 |
internal | 在同一個 模組 (Module) 內可見。 |
public (預設)
如果你不寫任何修飾子,預設就是 public。
這點跟 Java 的 package-private 不同,Java 預設只能在同 package 存取。
// 預設為 public
class User
val name = "Miko"
private
- Top-level: 只在當前檔案內可見。
- Class member: 只在該類別內可見。
private fun secret() { ... } // 只有這個檔案能呼叫
protected
只許自己和子類別存取。
注意: Kotlin 的 protected 不包含 同一個 package 的存取權限 (這點跟 Java 不同)。
open class Base {
protected val i = 1
}
class Derived : Base() {
fun test() {
println(i) // OK
}
}
internal (模組內可見)
這是 Kotlin 特有的。所謂的「模組」通常指:
- 一個 IntelliJ IDEA 模組
- 一個 Maven 專案
- 一個 Gradle Source Set
只要是在同一個編譯單位 (Module) 內,都可以存取 internal 成員。這非常適合編寫 Library,你想隱藏實作細節但又要在套件間共享時使用。
internal class Utils {
// 只有同個模組的程式碼能看到這個類別
}
總結與比較
| 特性 | Java | Kotlin |
|---|---|---|
| 預設值 | package-private | public |
internal | 無 (需透過 hack) | 同模組可見 |
protected | 子類別 + 同 package | 僅子類別 |