将密封的 class 声明为 object 的好处
Benefits of declaring a sealed class as object
上下文
我有这个 sealed class
和它的每个 children:
sealed class Section
class SearchSection : Section()
class FavoritesSection : Section()
class RecommendationsSection : Section()
class ProfileSection : Section()
但我在每个 class 声明中收到警告:
Sealed sub-classhas no state and no overrite equals
建议我将它们声明为:
object ProfileSection : Section()
问题
- 这样做的目的是什么?
- 有什么好处?
- 为什么我应该将它们写成
object
而不是 class
?
首先让我解释一下密封的目的是什么classes。 the official documentation 中的第一句话说:
Sealed classes are used for representing restricted class hierarchies, when a value can have one of the types from a limited set, but cannot have any other type. They are, in a sense, an extension of enum classes.
我相信您已经熟悉枚举,它们是一种特殊类型,可以将变量定义为预定义常量之一,并且其中每一个都可以存储一些额外的数据。每个常量只有一个实例。此时你可能已经注意到这个单一实例和数据保存的东西听起来像 Kotlin 对象。所以结果是这个枚举 class:
enum class Type(val value: String) {
A("a"),
B("b")
}
相当于这个密封的class:
sealed class Type(val value: String) {
object A : Type("a")
object B : Type("b")
}
(实际上枚举常量在 Kotlin 中是对象)。
sealed classes 的特别之处在于,它们允许您使用 classes 而不是对象来定义 "constants",因此它们可以有多个实例,因此可以存储一个实际的状态,例如:
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
}
所以终于可以回答你原来的问题了:
What is the purpose of this?
与枚举常量相同。如果你不需要在你的 "constant" 中存储一个状态,你只需要一个带有可选静态数据的命名类型,那么使用一个对象。
What are the benefits?
Why I should write them as object and not a class?
如果您的 "constant" 不需要状态,那么每次要使用它时都创建不同的实例只会浪费内存。
上下文
我有这个 sealed class
和它的每个 children:
sealed class Section
class SearchSection : Section()
class FavoritesSection : Section()
class RecommendationsSection : Section()
class ProfileSection : Section()
但我在每个 class 声明中收到警告:
Sealed sub-classhas no state and no overrite equals
建议我将它们声明为:
object ProfileSection : Section()
问题
- 这样做的目的是什么?
- 有什么好处?
- 为什么我应该将它们写成
object
而不是class
?
首先让我解释一下密封的目的是什么classes。 the official documentation 中的第一句话说:
Sealed classes are used for representing restricted class hierarchies, when a value can have one of the types from a limited set, but cannot have any other type. They are, in a sense, an extension of enum classes.
我相信您已经熟悉枚举,它们是一种特殊类型,可以将变量定义为预定义常量之一,并且其中每一个都可以存储一些额外的数据。每个常量只有一个实例。此时你可能已经注意到这个单一实例和数据保存的东西听起来像 Kotlin 对象。所以结果是这个枚举 class:
enum class Type(val value: String) {
A("a"),
B("b")
}
相当于这个密封的class:
sealed class Type(val value: String) {
object A : Type("a")
object B : Type("b")
}
(实际上枚举常量在 Kotlin 中是对象)。
sealed classes 的特别之处在于,它们允许您使用 classes 而不是对象来定义 "constants",因此它们可以有多个实例,因此可以存储一个实际的状态,例如:
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
}
所以终于可以回答你原来的问题了:
What is the purpose of this?
与枚举常量相同。如果你不需要在你的 "constant" 中存储一个状态,你只需要一个带有可选静态数据的命名类型,那么使用一个对象。
What are the benefits?
Why I should write them as object and not a class?
如果您的 "constant" 不需要状态,那么每次要使用它时都创建不同的实例只会浪费内存。