[英]What is the difference between sealed and internal in Kotlin?
sealed
的 class 將在所有模塊中可見,但只能在同一模塊中擴展。 這意味着如果你有這個:
sealed class MyClass {}
然后您可以在同一模塊中執行此操作:
class MyExtensionClass: MyClass() {}
但是你不能在另一個模塊中做同樣的事情。 但是您仍然可以在另一個模塊中同時使用MyClass
和MyExtensionClass
。 例如,您可以在另一個模塊中執行此操作:
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 或接口的已知實現是曾經傳遞給它(防止用戶創建某些東西的子類並將它們傳遞到庫中)。
獎金:
可見性修飾符關鍵字: public
、 internal
、 private
、 protected
Inheritance 修飾符關鍵字: open
、 final
、 sealed
data
和value
也會導致 class final
隱含地作為副作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.