2011-08-26 19 views
7

Immaginate questo semplice pezzo di codice:problema Scala costruttore opzionale

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() 
} 
} 

Il risultato è

null 
null 

Mi piacerebbe essere

calling elvis 
null 

come raggiungere questo obiettivo? Non posso chiamare il metodo testMethod dopo la creazione dell'oggetto.

Mazi

risposta

19

Il vostro metodo di prova viene chiamato nella principale costruttore prima cosa. Non è possibile che un altro costruttore possa evitare che venga chiamato prima dell'esecuzione del proprio codice.

Nel tuo caso, devi semplicemente capovolgere quale costruttore fa cosa. Avere il costruttore principale ha il parametro stringa, e quello ausiliario impostarlo su null. Aggiunto guadagno, puoi dichiarare la var direttamente nella lista dei parametri.

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

In generale, il costruttore principale dovrebbe essere quello più flessibile, tipicamente assegnando ciascun campo da un parametro. La sintassi di Scala rende tutto molto semplice. Puoi rendere privato quel costruttore principale se necessario.

Edit: ancora più semplice con parametro predefinito

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