2016-10-11 7 views
0

私はいくつかの単純なスカラーコーディングの練習中に、とコンストラクタパラメータの重複を使わずに、ケースクラスのイデオロギー問題にぶつかった。パラメータなしのケースクラス

それはすべてが、次の2非常に簡単なクラスで開始:それでは、私は実体Postを持っていると私はタイプのすべてのレコードを照会するコマンドとしてAllクラスを追加したいとしましょう

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。アップ私の現在のセットでは、実際には次のように書くことが容易になるだろう:

case class All extends Request(Posts) 

しかし、この場合、私はパラメータなしケースクラスがに廃止されていること、コンパイラの警告が表示されます。だから、1は次のようにそれを書き換えることをお勧めかもしれません。この場合、オブジェクト内しかし

case object All extends Request(Posts) 

すべてがが各要求の一意のIDを持つ避けたいそのidフィールドと一緒に、一度だけインスタンス化されます。

Allコマンドを表現するより良い方法を提案してください。は、コンストラクタ引数を複製する必要はありませんか?

ありがとうございます。

答えて

5

実際の警告は、パラメータリストのない

ケースクラスが許可されていないということです。いずれかのケース オブジェクトまたはケースクラスを明示的な `() 'をパラメータリストとして使用します。

ので、コンパイラによって提案されたのと同様に、このクラスに空のパラメータリストを与える:答えのための

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

お返事ありがとう – tkachuko

0

case classまたはcase objectを使用しないで、代わりにコンパニオンを適用してください。とにかく、あなたが毎回一意のIDが必要な場合は、実際にはここにオブジェクトを置く必要はありません。

class All extends Requests(Posts) 

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

getPosts(All()) 
+0

おかげで多くのことを、しかし、どのように平等について?ケースクラスの場合、私は等価(==)を無料で得る。この場合、私の側からそれをコード化する必要があります。 – tkachuko

+0

また、シリアル化についてはどうですか?ケースクラスでは、私も無料でそれを得るだろう – tkachuko

+0

@ tkachuko何のためにそれらを必要としますか?必要に応じて手動で行います。 – flavian

関連する問題