我在构造函数上使用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?
}
}
我想知道是否有任何我遗漏的东西。任何不需要重复参数默认值的想法?
谢谢!
答案 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();
}
}
`