9

我在构造函数上使用 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?
    }
}

我想知道我是否缺少任何东西。任何不需要复制参数默认值的想法?

谢谢!

4

5 回答 5

12

我不会真的推荐它,但你可以通过向你的构造函数添加另一个参数来做到这一点:

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

Unit是一个不错的选择,因为无论如何您只能将一件事传递给它,因此显式传递默认值不允许任何错误的可能性,但它可以让您调用正确的构造函数。

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

于 2010-10-28T18:28:17.197 回答
4

作为好奇的变通方法 hack,我的意思是 hack:您可以使用默认参数的内部表示:

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

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

于 2010-10-29T01:28:04.827 回答
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 构造函数,则此样式特别有用。

于 2010-10-29T08:32:49.817 回答
0

不适合所有目的,但子类可能会解决问题:

class DefaultMyClass extends MyClass()
于 2011-02-21T20:54:55.130 回答
0

如果我对问题的理解没有错,那么以下代码对我来说效果很好`

class Employee (

   ){
  def this( name :String ,

    eid :Int ){
    this();
  }
}

`

于 2017-06-09T13:58:04.963 回答