我正在尝试学习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
问题是,在plus
函数的末尾,您创建了一个全新的Person
对象(它复制了name
和salary
并增加了age
),但重要的是,它具有一个尚未运行changeSupport
的新addPropertyChangeListener
对象。
PropertyChangeSupport
似乎允许您没有定义任何侦听器,因此不会出错,也不会为您提供没有侦听器的线索