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 derif
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