Kotlin 侦听器对第二次呼叫没有反应

Kotlin 侦听器对第二次呼叫没有反应,kotlin,Kotlin,我正在努力学习Kotlin,我正在编写代码来测试和确认我的理解。在下面代码的结果中,我希望在接近结尾时看到“房产年龄从37岁更改为38岁”。为什么我看不到 起初我试着把年龄的增量写成age.plus,但结果是一样的 package ch07.ImplementingDelegatedProperties import java.beans.PropertyChangeSupport import java.beans.PropertyChangeListener open class Pro

我正在努力学习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
Property age changed from 37 to 38  << This line expected but not appearing
38
34
年龄变化
房产年龄从34岁变为35岁
35
年龄变化
房产年龄从35岁变为36岁
36
操作员更改的年龄
房产年龄从36岁变为37岁
操作员的年龄变化,36->37
年龄变化
房产年龄从36岁变为37岁
37
操作员更改的年龄
操作员的年龄变化,37->38
年龄变化

财产年龄从37岁更改为38岁问题在于,在
plus
功能结束时,您创建了一个全新的
Person
对象(它复制
姓名和
薪水,并增加
年龄
),但重要的是,它有一个新的
changeSupport
对象,您还没有在该对象上运行
addPropertyChangeListener


看起来
PropertyChangeSupport
允许您没有定义监听器,因此不会出错,也不会提示您没有监听器,您是个天才。这非常有效。我在plus函数中创建了新的person并向其中添加了侦听器,然后返回已附加侦听器的新person。
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