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 {
    // 只有同個模組的程式碼能看到這個類別
}

總結與比較

特性JavaKotlin
預設值package-privatepublic
internal無 (需透過 hack)同模組可見
protected子類別 + 同 package僅子類別