[英]Why is there a object class defined within sealed class when I use Kotlin?
代碼A來自官方示例工程。
Result<out R>
是一個密封的class,我很奇怪為什么Loading
定義為object class。
我覺得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:謝謝!
Android Studio在代碼C中添加is
before Loading -> "Loading"
后可以編譯運行。
1:Code A和Code C有什么區別?
2:還有,在我看來,sealed class里面的所有類型應該都是一樣的,可能都是數據class,也可能都是object。但是代碼A混合了數據class和object,沒關系,是不是意味着我在密封的 class 中添加偶數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
用於沒有任何屬性(不包含任何狀態)的 class。 object
意味着你不必創建它的多個實例,你永遠不必擔心你正在查看哪個實例,所以它更簡單。 您不必在其上調用構造函數來獲取實例,並且永遠不會有超過一個實例占用 memory。
請注意,如果Loading
是object
,代碼 B 中的is Loading
檢查仍然有效。 object
更通用,因為==
和is
檢查都有效並且有效地表示同一件事。
順便說一下(正如@a_local_nobody 之前提到的),您不能創建沒有屬性的數據 class,盡管您可以創建常規的 class。
那行不通,因為:
data class Loading : Result<Nothing>() <-- this isn't valid for a data class
數據類必須至少有一個主要的構造函數參數,大概作者在那里使用了一個 object 來避免必須使用構造函數值,與其他相比:
data class Success<out T>(val data: T) : Result<T>() <-- (val data: T)
data class Error(val exception: Exception) : Result<Nothing>() <-- (val exception: Exception)
這顯然需要價值觀
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.