2011-08-26 13 views
7

Wyobraźmy sobie ten prosty kawałek kodu:Scala problemem opcjonalnie konstruktor

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

wynik jest

null 
null 

Chciałbym być

calling elvis 
null 

Jak to osiągnąć? Nie mogę wywołać metody testMethod po utworzeniu obiektu.

Mazi

Odpowiedz

19

Twoja metoda testowa jest wywoływana najpierw w głównym konstruktorze. Nie ma możliwości, aby inny konstruktor uniknął wywołania przed uruchomieniem własnego kodu.

W twoim przypadku powinieneś po prostu odwrócić, który konstruktor robi co. Niech główny konstruktor ma parametr string, a pomocniczy ustawi go na wartość null. Dodano wzmocnienie, możesz zadeklarować var ​​bezpośrednio na liście parametrów.

Ogólnie rzecz biorąc, główny konstruktor powinien być bardziej elastyczny, zazwyczaj przypisując każde pole z parametru. Składnia Scala sprawia, że ​​robi się to bardzo łatwo. Możesz uczynić tego głównego konstruktora prywatnym, jeśli zajdzie taka potrzeba.

Edit: jeszcze prostsze z domyślnym parametrem

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