2011-08-26 10 views
7

Imagínese este simple trozo de código:problema Scala constructor opcional

class Constructor() { 
    var string: String = _ 

    def this(s: String) = {this() ; string = s;} 

    def testMethod() { 
    println(string) 
    } 

    testMethod 
} 

object Appl { 
    def main(args: Array[String]): Unit = { 
    var constructor = new Constructor("calling elvis") 
    constructor = new Constructor() 
} 
} 

El resultado es

null 
null 

me gustaría ser

calling elvis 
null 

cómo lograr esto? No puedo llamar al método testMethod después de la creación del objeto.

Mazi

Respuesta

19

Su método de prueba se denomina en el principal constructor de primera hora. No hay forma de que otro constructor evite que se llame antes de que se ejecute su propio código.

En su caso, simplemente debe invertir qué constructor hace qué. Haga que el constructor principal tenga el parámetro de cadena, y el auxiliar lo configure como nulo. Ganancia agregada, puede declarar la var directamente en la lista de parámetros.

class Constructor(var s: String) { 
    def this() = this(null) 
    def testMethod() = println(s) 
    testMethod() 
} 

En general, el constructor principal debe ser el más flexible, típicamente la asignación de cada campo de un parámetro. La sintaxis de Scala hace que hacer eso sea muy fácil. Puedes hacer que ese constructor principal sea privado si es necesario.

Editar: aún más simple con parámetros por defecto

class Constructor(var s: String = null) { 
    def testMethod = println(s) 
    testMethod 
} 
Cuestiones relacionadas