gpt4 book ai didi

android - 为什么我使用 Kotlin 时在密封类中定义了一个对象类?

转载 作者:行者123 更新时间:2023-12-05 00:13:00 26 4
gpt4 key购买 nike

代码 A 来自 official sample project .

Result<out R>是密封类,我很奇怪为什么Loading被定义为对象类。

我觉得Code B更合理,对吗?

代码 A

sealed class Result<out R> {
data class Success<out T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
object Loading : Result<Nothing>()

override fun toString(): String {
return when (this) {
is Success<*> -> "Success[data=$data]"
is Error -> "Error[exception=$exception]"
Loading -> "Loading"
}
}
}

代码 B

sealed class Result<out R> {
data class Success<out T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
data class Loading : Result<Nothing>()

override fun toString(): String {
return when (this) {
is Success<*> -> "Success[data=$data]"
is Error -> "Error[exception=$exception]"
is Loading -> "Loading"
}
}
}

添加内容:

致 Tenfour04 和 a_local_nobody:谢谢!

我添加is后Android Studio可以编译运行之前 Loading -> "Loading"在代码 C 中。

1:Code A 和 Code C 有什么不同?

2:还有更多,在我看来,所有类型的密封类都应该是相同的,也许它们都是数据类,或者它们都是对象。但是代码A混合了数据类和对象,还可以,是不是意味着我连Interface都加了?什么密封类?

代码 C

sealed class Result<out R> {
data class Success<out T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
object Loading : Result<Nothing>()

override fun toString(): String {
return when (this) {
is Success<*> -> "Success[data=$data]"
is Error -> "Error[exception=$exception]"
is Loading -> "Loading" // I add "is"
}
}
}

最佳答案

没有理由不将 object 用于没有任何属性(不包含任何状态)的类。 object 意味着您不必创建它的多个实例,并且您永远不必担心您正在查看哪个实例,因此它更简单。您不必在其上调用构造函数来获取实例,并且永远不会有多个实例占用内存。

请注意,如果 Loadingobject,则代码 B 中的 is Loading 检查仍然有效。 objects 更加通用,因为 ==is 检查都是有效的并且实际上意味着相同的东西。

顺便说一下(正如@a_local_nobody 之前提到的),您不能创建没有属性的数据类,尽管您可以创建一个常规类。

关于android - 为什么我使用 Kotlin 时在密封类中定义了一个对象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71601256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com