在Kotlin ,sealedinternal有什么不同?我已经阅读了Kotlin关于密封类和可见性修饰符的文档;然而,我仍然不清楚何时使用sealed还是internal.也许有人可以提供真实世界的代码样本?

Sealed classes | Kotlin&Visibility modifiers | Kotlin资源.

推荐答案

sealed类将在所有模块中可见,但只能在同一模块中扩展.这意味着如果你有这个:

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

class MyExtensionClass: MyClass() {}

但你不能在另一个模块中做同样的事情.但你仍然可以在另一个模块中同时使用MyClassMyExtensionClass. 例如,您可以在另一个模块中执行此操作:

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:

您有一些创建实现的接口和工厂,但您不希望实现类在编译时对库用户可见.他们只使用工厂,不需要担心实现.不过,他们可能会构建自己的实现,因此不使用您提供的工厂,这是可以的.

Kotlin相关问答推荐

Kotlin中一个接口的实现问题

可以从背景图像中点击图标吗?

我可以在kotlin/java.util.scanner中跳过分隔符而不重复吗?

在Kotlin lambda的参数中如何指定函数类型?

kotlin 模式匹配如何像 scala 一样工作

使用 Kotlin 的 Springboot 中缺少 ResponseEntity 正文属性

如何在 micronaut 上启用 swagger UI?

在 Kotlin 中,为什么在 `+` 之前但在 `.` 之前没有换行符?

Kotlin 插件之间的区别

java - 如何将函数作为参数从java传递给kotlin方法?

为什么 Kotlin 需要函数引用语法?

Kotlin 和 Java 字符串拆分与正则表达式的区别

API 'variant.getJavaCompile()' 已过时

Kotlin 有 array.indexOf 但我无法弄清楚如何做 array.indexOfBy { lambda }

Kotlin:sealed class cannot "contain" data classes?

Kotlin Native如何将字节数组转换为字符串?

你如何在 Kotlin 中注释 Pair 参数?

Kotlin 错误:public function exposes its 'public/*package*/' return type argument

Kotlin 是否支持部分应用程序?

具有多个 parameter的 Kotlin 枚举