Scala额外的无参数构造函数以及默认构造函数参数

时间:2010-10-28 18:08:44

标签: scala constructor default-parameters scala-java-interop

我在构造函数上使用Scala 2.8默认参数,出于Java兼容性原因,我想要一个使用默认参数的无参数构造函数。

这不是出于非常合理的原因:

class MyClass(field1: String = "foo", field2: String = "bar") {
    def this() = {
        this() // <-- Does not compile, but how do I not duplicate the defaults?
    }
}

我想知道是否有任何我遗漏的东西。任何不需要重复参数默认值的想法?

谢谢!

5 个答案:

答案 0 :(得分:12)

我不会推荐它,但你可以通过在构造函数中添加另一个参数来实现它:

class MyClass(a: String = "foo", b: String = "bar", u: Unit = ()) {
  def this() { this(u = ()) }
}

Unit是一个不错的选择,因为无论如何你只能传递一个东西,所以显式传递默认值不允许任何错误的可能性,但它允许你调用正确的构造函数。

如果您愿意仅复制一个默认值,则可以使用相同的策略,除了覆盖一个选择的默认值而不是添加单位参数。

答案 1 :(得分:4)

作为好奇的解决方法,我做意味着破解:你可以使用默认参数的内部表示:

class MyClass(field1: String = "foo", field2: String = "bar") { 
  def this() =  this(MyClass.init$default$1)
}

请注意,需要在 this(MyClass.init $ default $ 1)中包含MyClass。部分解释是默认参数保存在伴随对象中。

答案 2 :(得分:4)

您可以考虑使用工厂方法:

class MyClass(field1: String = "foo", field2: String = "bar")
object MyClass {
    def newDefaultInstance = new MyClass
}

然后从Java中你可以调用MyClass.newDefaultInstance()

另一种可能性是移动到指定默认值的位置:

class MyClass(field1: String, field2: String) {
  def this() = this(field1="foo", field2="bar")
}

如果您正在使用Spring之类的框架(使用反射来定位0-arg构造函数),则此样式特别有用。

答案 3 :(得分:0)

不适用于所有目的,但子类可能会起作用:

class DefaultMyClass extends MyClass()

答案 4 :(得分:0)

如果我在理解这个问题时没有错,那么以下代码对我来说非常有效。

class Employee (

   ){
  def this( name :String ,

    eid :Int ){
    this();
  }
}

`