监听者不响应第二个电话

问题描述 投票:0回答:1

我正在尝试学习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
kotlin
1个回答
0
投票

问题是,在plus函数的末尾,您创建了一个全新的Person对象(它复制了namesalary并增加了age),但重要的是,它具有一个尚未运行changeSupport的新addPropertyChangeListener对象。

PropertyChangeSupport似乎允许您没有定义任何侦听器,因此不会出错,也不会为您提供没有侦听器的线索

© www.soinside.com 2019 - 2024. All rights reserved.