2016-10-11 53 views
0

在一些簡單的斯卡拉編碼練習期間,我遇到了案例類的意識形態問題,沒有參數構造函數參數重複案例類沒有參數替代

這一切都始於以下兩種完全簡單的類

trait Namespace 

    case class Reply[T](namespace: Namespace, correlation: String, data: Try[T]) 

    abstract class Request(val namespace: Namespace, val id: String = UUID.randomUUID().toString) { 

    def success[T](data: T) = Reply(namespace, id, Try(data)) 

    def failure(msg: String) = Reply(namespace, id, Failure(new RuntimeException(msg))) 
    } 

現在讓我們假設我有一個實體Post,我想補充All類作爲命令查詢類型的所有記錄Post。在我的當前設置會更容易實際編寫如下:

case class All extends Request(Posts) 

然而,在這種情況下,我得到的編譯器警告說,如果不帶參數case類已被棄用。因此,人們可能會建議將其改寫成如下:

case object All extends Request(Posts) 

然而,在這種情況下,所有的對象將其id字段,它想避免其爲每個請求唯一的ID一起一次被實例化。

可否請你建議代表,使其將不需要複製構造函數的參數All命令的更好的辦法?

在此先感謝?

回答

5

實際的警告是,

case類不帶參數列表都是不允許的;使用 對象或具有顯式`()'的案例類作爲參數列表。

所以給這個類空參數列表,就像由編譯器建議:

case class All() extends Requests(Posts) 
+0

非常感謝您的回答 – tkachuko

0

不要使用case classcase object,只需用一個伴侶,而不是適用。如果您需要每個請求的唯一ID,則無論如何您都不需要任何對象。

class All extends Requests(Posts) 

object All { 
    def apply(): All = new All() 
} 

getPosts(All()) 
+0

非常感謝的答案,但是,怎麼樣的平等?在案例類的情況下,我可以免費獲得等於(==)。在這種情況下,我需要編碼它。 – tkachuko

+0

又如何序列化?在這種情況下,我也可以免費獲得 – tkachuko

+0

@tkachuko你需要什麼?如果需要手動執行它們。 – flavian