2016-10-11 76 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