2015-08-21 2 views
12

Diese beiden Klassen verhalten sich unterschiedlich; Die Ursache scheint mit der Verwendung einer private[this] Erklärung anstelle einer private verbunden zu sein. Kann jemand erklären, warum, bitte?Unerwarteter Unterschied im Verhalten, scheinbar aufgrund der Verwendung von [privat] anstelle von privat

  • private:

    class Person(
        private var _age: Int 
    ) { 
        if (_age < 0) { _age = 0 } 
    
        def age = _age 
        def age_=(newAge: Int) { 
        if (newAge > _age) { _age = newAge } 
        } 
    } 
    

    Im REPL verhält sich dies, wie ich für beide Klassen erwartet wurde; das heißt, die age Methode ruft _age, die auf den entsprechenden Wert während der Konstruktion festgelegt wurde:

    scala> val person = new Person(-1) 
    person: Person = [email protected] 
    
    scala> person.age 
    res0: Int = 0 
    
  • private[this]:

    class Person(
        private[this] var _age: Int 
    ) { 
        if (_age < 0) { _age = 0 } 
    
        def age = _age 
        def age_=(newAge: Int) { 
        if (newAge > _age) { _age = newAge } 
        } 
    } 
    

    Im REPL, person.age wird der Wert von _age vor nehmen auf die Auswertung der if Ausdruck. Es funktioniert wie erwartet, nachdem die Setter verwenden, obwohl:

    scala> val person = new Person(-1) 
    person: Person = [email protected] 
    
    scala> person.age 
    res0: Int = -1 
    
    scala> person.age = 0 
    person.age: Int = 0 
    
    scala> person.age 
    res1: Int = 0 
    

Antwort