在Kotlin ,sealed
和internal
有什么不同?我已经阅读了Kotlin关于密封类和可见性修饰符的文档;然而,我仍然不清楚何时使用sealed
还是internal
.也许有人可以提供真实世界的代码样本?
Sealed classes | Kotlin&;Visibility modifiers | Kotlin资源.
在Kotlin ,sealed
和internal
有什么不同?我已经阅读了Kotlin关于密封类和可见性修饰符的文档;然而,我仍然不清楚何时使用sealed
还是internal
.也许有人可以提供真实世界的代码样本?
Sealed classes | Kotlin&;Visibility modifiers | Kotlin资源.
sealed
类将在所有模块中可见,但只能在同一模块中扩展.这意味着如果你有这个:
sealed class MyClass {}
,然后您可以在同一模块中执行此操作:
class MyExtensionClass: MyClass() {}
个
但你不能在另一个模块中做同样的事情.但你仍然可以在另一个模块中同时使用MyClass
和MyExtensionClass
.
例如,您可以在另一个模块中执行此操作:
val x: MyClass = MyExtensionClass()
无论是在同一个模块中还是在另一个模块中,都不能直接实例化一个sealed
类.这意味着你不能在任何地方做到这一点:
val x = MyClass()
因此,密封类基本上是一个抽象类,只能在同一模块中实现.
internal
类可以像sealed
类一样在同一个模块中使用和扩展,但在另一个模块中两者都不能使用和扩展.所以您甚至不能在另一个模块中使用或实例化它.您还可以直接实例化一个internal
类,只要您是在同一个模块中这样做的.
所以:使用sealed
可以更好地控制扩展.例如,您创建了一个库,并且希望使用该库中的类,但不对其进行扩展.如果您不想让您的类对其他模块不可见(您创建了一个库,但库中的某些类甚至不应该被库用户直接编译时使用),请使用internal
A good use case for sealed class:个
您构建了一个库,并拥有一些具有多个不同实现的抽象类或接口,但您希望确保库用户不会添加其自己的实现(您不希望控制实现细节).
A good use case for internal class:个
您有一些创建实现的接口和工厂,但您不希望实现类在编译时对库用户可见.他们只使用工厂,不需要担心实现.不过,他们可能会构建自己的实现,因此不使用您提供的工厂,这是可以的.