Kotlin教學 | 從零開始學Kotlin | Kotlin入門 | CH11: 可視性修飾符(Visibility Modifiers)

可視性修飾符

可視性修飾符用於控制類別、物件、介面、構造函數、函數以及屬性(包括set()get()則是與屬性相同)的可見範圍,也就是這些元素在哪裡可以被看見(存取和使用)。

Kotlin 提供了四種可視性修飾符:publicprivateprotectedinternal
如果沒有指定修飾符,則預設使用 public,表示在任何地方都可以看見(存取和使用)。

publicprivateprotectedinternal
頂層宣告(如函數、屬性、類別、對象聲明等)任何地方都可以看見同一檔案內可以看見。不能用於頂層聲明。同一模塊內可以看見。
類別和介面的構造函數或成員任何地方都可以看見在該類別或介面內可以看見。可見度和private相同,但繼承的子類別(或子介面)也可以看見。同一模塊內可以看見。

模塊(Modules)

是一組一起編譯的 Kotlin 檔案,例如: 使用下面方法一起編譯的檔案:

  • 一個 IntelliJ IDEA 模塊;
  • 一個 Maven 或 Gradle 項目;
  • 一次 <kotlinc> Ant 任務執行編譯的一組文件。

Example

頂層宣告

直接在套件(Packages)級別內宣告的函數、屬性、類別、物件和介面,被稱為頂層宣告(top-level):

  • public(默認):預設情況下,所有的頂層宣告都是公開的,即在任何地方都可以看到。
  • private:只在宣告可視性修飾符的檔案內可以看到。
  • internal:只在相同模塊內可以看到。
  • protected:頂層宣告不使用protected
// file name: example.kt
package foo

private fun foo() { ... } // visible inside example.kt

public var bar: Int = 5 // property is visible everywhere
    private set         // setter is visible only in example.kt

internal val baz = 6    // visible inside the same module

類別或介面的構造函數或成員

對於在類別內宣告的成員或構造函數:

  • private:僅在該類別內部可以看到(包括它自己底下的成員,如果有)。
  • protected:可見度和 private 相同,但繼承的子類別也可以看到。
  • internal:同一模塊內的其他人,如果可以看到類別,則也可以看到。
  • public:任何可以看到類別的人,都可以看到。
open class Outer {
    private val a = 1
    protected open val b = 2
    internal open val c = 3
    val d = 4  // public by default

    protected class Nested {
        public val e: Int = 5
    }
}

class Subclass : Outer() {
    // a is not visible
    // b, c and d are visible
    // Nested and e are visible

    override val b = 5   // 'b' is protected
    override val c = 7   // 'c' is internal
}

class Unrelated(o: Outer) {
    // o.a, o.b are not visible
    // o.c and o.d are visible (same module)
    // Outer.Nested is not visible, and Nested::e is not visible either
}

class C private constructor(a: Int) { } // 構造函數標記為 private

本地聲明(Local Declarations)

本地變量、函數和類別不能有可視性修飾符。

fun main() {
    //protected val numA = 5 // Error: Modifier 'protected' is not applicable to 'local variable'
    val numB = 5
}

使用場景和原則

  • 私有化(Private):當你想隱藏某個成員的實現時,應該使用 private。這有助於封裝該成員,外部程式碼無法直接訪問。
  • 保護(Protected):當你想讓一個成員在子類中可用,但對其他類別保持不可見時,使用 protected
  • 內部(Internal):當你想限制對於某個成員的訪問僅限於同一模塊內時,使用 internal。這有助於在大型項目中管理模塊間的依賴。
  • 公開(Public):當你想讓成員在任何地方都可看見時,使用 public。這適用於公開 API 的部分。

Reference

https://kotlinlang.org/docs/visibility-modifiers.html

發佈留言