簡體   English   中英

Kotlin 中的密封和內部有什么區別?

[英]What is the difference between sealed and internal in Kotlin?

Kotlin 中的sealedinternal有什么區別? 我已經閱讀了 Kotlin 關於密封類和可見性修飾符的文檔; 但是,我仍然不清楚何時使用sealedinternal 也許有人可以提供真實世界的代碼示例?

密封類 | Kotlin & 能見度修改器 | Kotlin資源。

sealed的 class 將在所有模塊中可見,但只能在同一模塊中擴展。 這意味着如果你有這個:

sealed class MyClass {}然后您可以在同一模塊中執行此操作:

class MyExtensionClass: MyClass() {}

但是你不能在另一個模塊中做同樣的事情。 但是您仍然可以在另一個模塊中同時使用MyClassMyExtensionClass 例如,您可以在另一個模塊中執行此操作:

val x: MyClass = MyExtensionClass()

您不能在同一模塊或另一個模塊中直接實例化sealed的 class 。 這意味着你不能在任何地方這樣做:

val x = MyClass()

所以密封的 class 基本上是一個抽象的 class 只能在同一個模塊中實現。

internal class 可以像sealed的 class 一樣在同一個模塊中使用和擴展,但您不能在另一個模塊中這樣做。 所以你甚至不能在另一個模塊中使用或實例化它。 你也可以直接實例化一個internal class,只要你在同一個模塊中進行。

所以:使用sealed來更好地控制擴展。 例如,您創建了一個庫,並且希望使用該庫中的 class 但不進行擴展。 如果您不希望 class 對其他模塊不可見,請使用internal (您創建了一個庫,但該庫中的某些 class 甚至不應該直接編譯時可供庫用戶使用)

密封 class 的一個很好的用例:

您構建了一個庫並擁有一些抽象的 class 或具有多個不同實現的接口,但您希望確保庫用戶不會添加自己的實現(您不想控制實現細節)。

內部 class 的一個很好的用例:

您有一些接口和一個創建實現的工廠,但您不希望實現 class 在編譯時對庫用戶可見。 他們只使用工廠,不需要擔心實施。 他們可能會構建自己的實現,因此不使用您提供的工廠,這沒關系。

這些不是相互排斥的。 您也可以使用internal sealed class

internal是關於可見性, sealed是關於 inheritance 規則。

internal表示 class 類型僅在模塊內可見。 在其他模塊中,您甚至不能提及類型的名稱。

sealed意味着它是open的(可以被子類化),但子類(或實現,如果它是密封接口)只能在同一個模塊中定義,並且編譯器會跟蹤所有子類的詳盡列表。 另一個規則是你不能創建它的匿名子類( object: MySealedClass )。 密封類型的優點是編譯器知道您何時在when語句、if/else 鏈等中徹底檢查了一個類型。它也可以在庫中使用以確保只有 class 或接口的已知實現是曾經傳遞給它(防止用戶創建某些東西的子類並將它們傳遞到庫中)。


獎金:

可見性修飾符關鍵字: publicinternalprivateprotected

Inheritance 修飾符關鍵字: openfinalsealed

datavalue也會導致 class final隱含地作為副作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM