Я пытаюсь выучить Kotlin и пишу код для проверки и подтверждения моего понимания. В результате выполнения следующего кода я ожидаю увидеть «Возраст объекта изменен с 37 до 38» ближе к концу. Почему я этого не вижу.
Сначала я пытался записать приращение к возрасту как age.plus, но это дало тот же результат.
package ch07.ImplementingDelegatedProperties
import java.beans.PropertyChangeSupport
import java.beans.PropertyChangeListener
open class PropertyChangeAware {
protected val changeSupport = PropertyChangeSupport(this)
fun addPropertyChangeListener(listener: PropertyChangeListener) {
changeSupport.addPropertyChangeListener(listener)
}
fun removePropertyChangeListener(listener: PropertyChangeListener) {
changeSupport.removePropertyChangeListener(listener)
}
}
class Person(
val name: String, age: Int?, salary: Int
)
: PropertyChangeAware()
{
var age: Int? = age
set(newValue) {
println("age changed")
val oldValue = field
field = newValue
changeSupport.firePropertyChange(
"age", oldValue, newValue)
}
var salary: Int = salary
set(newValue) {
val oldValue = field
field = newValue
changeSupport.firePropertyChange(
"salary", oldValue, newValue)
}
operator fun plus (older: Int) :Person {
println("age changed by operator")
val oldValue = age
val newValue = (oldValue?: 0) + older
changeSupport.firePropertyChange( // don't know why this dosn't fire repeatedly
"age", oldValue, newValue)
println("age chg by operator, $oldValue -> $newValue")
this.age = (oldValue?: 0) + older
// this._attributes = _attributes
return Person(name, age = age, salary = salary)
}
}
fun main(args: Array<String>) {
var p = Person("Dmitry", 34, 2000)
p.addPropertyChangeListener(
PropertyChangeListener { event ->
println("Property ${event.propertyName} changed " +
"from ${event.oldValue} to ${event.newValue}")
}
)
println(p.age)
p.age = 35
println(p.age.toString())
p.age = 36
println(p.age.toString())
p = p + 1
println(p.age.toString())
p = p + 1
println(p.age.toString())
p.salary = 2100
}
Фактические результаты:
34
age changed
Property age changed from 34 to 35
35
age changed
Property age changed from 35 to 36
36
age changed by operator
Property age changed from 36 to 37
age chg by operator, 36 -> 37
age changed
Property age changed from 36 to 37
37
age changed by operator
age chg by operator, 37 -> 38
age changed
38
Ожидаемые результаты:
34
age changed
Property age changed from 34 to 35
35
age changed
Property age changed from 35 to 36
36
age changed by operator
Property age changed from 36 to 37
age chg by operator, 36 -> 37
age changed
Property age changed from 36 to 37
37
age changed by operator
age chg by operator, 37 -> 38
age changed
Property age changed from 37 to 38 << This line expected but not appearing
38