Слушатель не реагирует на второй звонок - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь выучить 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

1 Ответ

0 голосов
/ 28 октября 2019

Проблема в том, что в конце вашей функции plus вы создаете новый объект Person (который копирует name и salary и увеличивает age), но, что важно, он имеетновый changeSupport объект, на котором вы не запускали addPropertyChangeListener.

Похоже, что PropertyChangeSupport позволяет вам не определять прослушивателей, поэтому не выдаст ошибку или не даст вам подсказку, чтоне слушатель

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...