案例类允许使用构造函数吗?

时间:2010-09-22 19:41:33

标签: scala traits case-class

我有一个案例类(让它命名为Stuff),我希望能够通过扩展特征(称之为Marker)在运行时创建匿名子类。这是一个REPL会话的片段,说明了我正在尝试做的事情:

scala> trait Marker
defined trait Marker

scala> case class Stuff(i: Int)
defined class Stuff

scala> val a = Stuff(1)
a: Stuff = Stuff(1)

scala> val b = new Stuff(1) with Marker
b: Stuff with Marker = Stuff(1)

注意a如何使用Stuff.apply()进行实例化,而在b的情况下,我正在调用case类的构造函数。

我的问题是:是使用构造函数kosher实例化案例类吗?在我看来,因为案例类提供了常见的便利,例如==,{{ 1}}和.equals()都可以。我是否遗漏了任何会影响我正在做什么 Bad Thing(TM)的东西?

.hashCode()

2 个答案:

答案 0 :(得分:3)

问题

  

使用构造函数kosher

实例化案例类

答案肯定是肯定的。像

这样的东西
val b = new Stuff(1)

完全没有问题。现在,new Stuff(1) with Marker是不同的,因为创建了Stuff的匿名子类。不过,我相信它仍然没有问题。当案例类从其他案例类继承并且您没有这样做时,我知道的问题出现了。但我可能没有意识到某些事情。

编辑:刚刚在REPL中测试匹配:

scala> val b = new Stuff(1)
b: Stuff = Stuff(1)

scala> b match {case Stuff(x) => x}
res0: Int = 1

scala> b match {case Stuff(_) => true}
res1: Boolean = true

答案 1 :(得分:3)

以下是Stuff.apply的实施方式:

object Stuff {
  def apply(i: Int): Stuff = new Stuff(i)
}

因此使用new Stuff时没有任何伤害。