Dan*_*ico 7 kotlin sealed-class
我有这个sealed class和它的每个孩子:
sealed class Section
class SearchSection : Section()
class FavoritesSection : Section()
class RecommendationsSection : Section()
class ProfileSection : Section()
Run Code Online (Sandbox Code Playgroud)
但我收到每个类声明的警告:
密封子类没有状态并且没有覆盖等于
这建议我将它们声明为:
object ProfileSection : Section()
Run Code Online (Sandbox Code Playgroud)
object而不是 a class?jsa*_*mol 17
首先让我解释一下密封类的目的是什么。官方文档的第一句话是这样说的:
密封类用于表示受限类层次结构,此时值可以具有有限集中的类型之一,但不能具有任何其他类型。从某种意义上说,它们是枚举类的扩展。
我相信您已经熟悉枚举,它们是一种特殊类型,可以将变量定义为预定义常量之一,并且每个常量都可以存储一些附加数据。并且每个常量都只有一个实例。此时您可能已经注意到这个单一实例和数据保存的东西听起来像 Kotlin 对象。所以事实证明这个枚举类:
enum class Type(val value: String) {
A("a"),
B("b")
}
Run Code Online (Sandbox Code Playgroud)
相当于这个密封类:
sealed class Type(val value: String) {
object A : Type("a")
object B : Type("b")
}
Run Code Online (Sandbox Code Playgroud)
(事实上,枚举常量是 Kotlin 中的对象)。
密封类的特殊之处在于它们允许您使用类而不是对象来定义“常量”,因此它们可以拥有多个实例并因此存储实际状态,例如:
sealed class ApiReponse
data class Success(val data: Data) : ApiResponse()
object Error : ApiResponse()
fun getResponse(): ApiResponse {
...
return if (apiCall.isSuccessful) Success(apiCall.data) else Error
}
Run Code Online (Sandbox Code Playgroud)
最后回答你原来的问题:
这样做的目的是什么?
与枚举常量相同。如果您不需要在“常量”中存储状态,并且只需要带有可选静态数据的命名类型,那么请使用对象。
有什么好处?
为什么我应该将它们写为对象而不是类?
如果你不需要你的“常量”有一个状态,那么每次你想使用它时创建它的不同实例只是浪费内存。
| 归档时间: |
|
| 查看次数: |
4166 次 |
| 最近记录: |