Scala:是否可以覆盖默认的case类构造函数?

时间:2010-04-18 03:11:58

标签: scala scala-2.8

只是想知道这是否可行。 我真正想要做的是检查并可能修改其中一个参数,然后将其存储为val。

或者,我可以使用重载并将默认构造函数设为私有。在这种情况下,我还想私有对象对象中的默认工厂构造函数,我该怎么做?

非常感谢。

亚当

编辑:我发现默认构造函数私有也使默认工厂构造函数私有,所以我有一个解决方案,我仍然有兴趣知道默认构造函数是否可以覆盖

4 个答案:

答案 0 :(得分:23)

您没有选择更改默认构造函数存储其参数的方式(例如,通过在将参数存储为val之前修改参数),但您可以选择在参数时抛出异常是错误的(这将在存储参数后发生)

case class Foo(x:Int){
    if (x<0) throw SomeException;
}

您还可以选择实现调用第一个构造函数的其他构造函数

case class Foo(x:Int){
     def this(x:Int,y:Int) = this(x+y)
}

但那些没有工厂方法。

您可以通过将工厂方法添加到配套对象

来轻松创建工厂方法
object Foo{
     def apply(x:Int,y:Int) = new Foo(x,y)
}

除此之外的任何其他事情,你必须放弃案例类并自行实现它的部分:applyunapplyequalshashCode Scala编程讨论了如何完成所有这些工作,为equalshashCode提供了良好的公式。

答案 1 :(得分:11)

辅助案例类构造函数的存在不会导致编译器在类的伴随中生成其他工厂方法,因此您无法获得CaseClaseName(«secondary constructor parameter list»>)创建它们的便利。您必须使用new关键字。

最好将您在备用工厂方法中描述的逻辑类型放在配套对象中,并坚持使用主构造函数。

答案 2 :(得分:3)

您可以重载构造函数。它与C ++或Java中的相同。只需创建另一个构造函数。

class Foo( _input:Int ){
    def this() = this( 0 )
}

或者你可以看到this SO post。

答案 3 :(得分:1)

您可以通过在随播对象中编写自己的apply(用于工厂)和unapply(用于模式匹配)方法,将常规类转换为伪案例类。或者,您可以在case类的伴随对象中编写一个命名的工厂方法。