2010-10-28 43 views
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? 
    } 
} 

我想知道如果有什么,我很想念。任何不需要重复参数默认值的想法?

谢谢!

+1

有一张票在https://lampsvn.epfl.ch/trac/scala/ticket/4278 – 2011-02-22 13:50:50

+1

我在我的第一次肉体scala会议上发言赞成这张票,并说肉是消耗的通过贪婪的“不要用你的特例“狼”来破坏语言。现在每个用例都是他自己的! – extempore 2011-03-11 12:20:50

回答

12

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

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

Unit是一个不错的选择,因为你只能通过一件事到也无妨,因此明确通过默认值不允许任何错误的可能性,但它可以让你调用正确的构造函数。

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

+0

我同意这是在我的问题精神(尽量减少重复),但不是一个很好的做法。感谢你的回答! – jkl 2010-10-29 19:53:06

4

好奇变通办法破解,而我呢意思破解:您可以使用默认参数的内部表示:

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

注意,它需要包括MyClass的在这个(MyClass.init $ default $ 1)。部分解释是默认参数保存在随播对象中。

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构造函数。

+0

感谢您的想法。在我的确切情况下,第一个不会工作,因为这是一个我正在初始化的Servlet(所以我需要无参数)。第二个是可行的,但是我在默认值提供的测试中失去了令人愉快的默认行为。如果我不需要无参数的构造函数,我可能会转向第一个... – jkl 2010-10-29 16:27:09

0

不适合所有目的,但是子类可能做的伎俩:如果我理解这个问题,下面的代码没有错

class DefaultMyClass extends MyClass() 
0

工作得很好me`

class Employee (

    ){ 
    def this(name :String , 

    eid :Int){ 
    this(); 
    } 
} 

`