簡體   English   中英

為什么我用Kotlin時sealed class里面定義了object class?

[英]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。

請注意,如果Loadingobject ,代碼 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM