scala constructor default-parameters scala-java-interop

Constructor Scala extra no-arg más parámetros de constructor por defecto



package in scala (5)

Realmente no lo recomendaría, pero puedes hacerlo agregando otro parámetro a tu constructor:

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

Unit es una buena opción porque solo puede pasar una cosa en ella de todos modos, por lo que pasar explícitamente el valor predeterminado no permite ninguna posibilidad de error y, sin embargo, le permite llamar al constructor correcto.

Si está dispuesto a replicar solo uno de los valores predeterminados, puede usar la misma estrategia, excepto anular ese valor predeterminado elegido en lugar de agregar el parámetro de la unidad.

Estoy usando los parámetros predeterminados de Scala 2.8 en un constructor, y por razones de compatibilidad con Java, quería un constructor sin argumentos que utilizara los parámetros predeterminados.

Esto no funciona por razones muy sensatas:

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

Me pregunto si hay algo que me estoy perdiendo. ¿Alguna idea que no requiera duplicar los parámetros predeterminados?

¡Gracias!


Como curioso trabajo de corte, y me refiero a piratear : puede utilizar la representación interna de los argumentos predeterminados:

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

Tenga en cuenta que es necesario incluir MyClass en este (MyClass.init $ default $ 1) . Una explicación parcial es que los argumentos predeterminados se guardan en objetos complementarios.


Puede considerar usar un método de fábrica:

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

Luego, desde Java, puedes llamar a MyClass.newDefaultInstance()

Otra posibilidad es moverse donde especifica los valores predeterminados:

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

Este estilo es especialmente útil si está trabajando con un marco como Spring que usa la reflexión para ubicar un constructor de 0 arg.


No es adecuado para todos los propósitos, pero una subclase podría hacer el truco:

class DefaultMyClass extends MyClass()


Si no me equivoco al entender la pregunta, el siguiente código funcionó muy bien para mí ".

class Employee ( ){ def this( name :String , eid :Int ){ this(); } }

`