Java PropertyChangeListener détecte les modifications de propriété

1.Tout d'abord

Cette fois, je voudrais expliquer comment détecter qu'une propriété a été modifiée en utilisant l'API Java standard PropertyChangeListener.

Le processus de détection des événements est bien connu dans SWT, Swing et AWT, qui sont des applications d'interface graphique Java, mais même les classes Java ordinaires ont un mécanisme pour détecter les événements dont les propriétés ont changé.

2. Mise en œuvre

2.1. Classes à vérifier

Item.java


package com.example.demo;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class Item {

    private int price;

    //★ Point 1
    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    //★ Point 2
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        this.pcs.addPropertyChangeListener(listener);
    }

    //★ Point 3
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        this.pcs.removePropertyChangeListener(listener);
    }

    public int getPrice() {
        return price;
    }

    //★ Point 4
    public void setPrice(int price) {
        int oldPrice = this.price;
        this.price = price;
        this.pcs.firePropertyChange("price", oldPrice, price);
    }

    // generated by eclipse
    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Item [price=");
        builder.append(price);
        builder.append("]");
        return builder.toString();
    }
}

** ★ Point 1 ** Créez une instance de java.beans.PropertyChangeSupport et définissez-la comme un champ. L'argument constructeur de «PropertyChangeSupport» spécifie «this» car c'est l'objet à partir duquel l'événement est né (détecté).

** ★ Point 2 ** Implémentez la méthode pour ajouter java.beans.PropertyChangeListener au PropertyChangeSupport défini dans ★ Point 1.

** ★ Point 3 ** Implémentez une méthode qui supprime java.beans.PropertyChangeListener de PropertyChangeSupport. Veuillez penser que ★ Point 2 et ★ Point 3 sont les éléments habituels à implémenter en tant qu'ensemble.

** ★ Point 4 ** Déclenchez un événement de changement de propriété avec la méthode firePropertyChange de PropertyChangeSupport.

Person.java


package com.example.demo;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class Person {

    private String name;

    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        this.pcs.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        this.pcs.removePropertyChangeListener(listener);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        String oldName = this.name;
        this.name = name;
        this.pcs.firePropertyChange("name", oldName, name);
    }

    // generated by eclipse
    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Person [name=");
        builder.append(name);
        builder.append("]");
        return builder.toString();
    }
}

2.2. Classe qui détecte les changements

DemoListener.java


package com.example.demo;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

//★ Point 5
public class DemoListener implements PropertyChangeListener {

    //★ Point 6
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        //★ Point 7
        Object eventTriggerObject = evt.getSource();
        String propertyName = evt.getPropertyName();

        //★ Point 8
        if (Item.class.isInstance(eventTriggerObject)) {
            if ("price".equals(propertyName)) {
                //★ Point 9
                Integer oldValue = (Integer) evt.getOldValue();
                Integer newValue = (Integer) evt.getNewValue();
                System.out.println("[Item.price] oldValue:" + oldValue + " -> newValue:" + newValue);
            }
        } else if (Person.class.isInstance(eventTriggerObject)) {
            if ("name".equals(propertyName)) {
                String oldValue = (String) evt.getOldValue();
                String newValue = (String) evt.getNewValue();
                System.out.println("[Person.name] oldValue:" + oldValue + " -> newValue:" + newValue);
            }
        }
    }
}

** ★ Point 5 ** Définit une classe qui implémente l'interface java.beans.PropertyChangeListener.

** ★ Point 6 ** Implémentez le processus de gestion des événements de changement de propriété en remplaçant la méthode propertyChange.

** ★ Point 7 ** Récupérez l'objet à partir duquel l'événement de modification est né avec la méthode getSource () de java.beans.PropertyChangeEvent. En outre, la propriété modifiée peut être spécifiée à l'aide de la méthode getPropertyName () car le nom de la propriété peut être obtenu.

** ★ Point 8 ** Cette fois, les écouteurs sont enregistrés à la fois dans la classe ʻItem et dans la classe Person`, il est donc nécessaire de déterminer quelle instance est la source.

** ★ Point 9 ** La valeur avant le changement de propriété est obtenue par la méthode getOldValue (), et la valeur après la modification est obtenue par la méthode getNewValue (). La valeur de retour est ʻObject`, vous devez donc la convertir en fonction du type de données de la propriété.

2.3. Classe d'application de démonstration de contrôle d'opération

App.java


package com.example.demo;

public class App {

    public static void main(String[] args) {
        Item item = new Item();
        System.out.println(item);
        item.setPrice(500);
        System.out.println(item);

        DemoListener demoListener = new DemoListener();
        item.addPropertyChangeListener(demoListener);

        item.setPrice(700);
        item.setPrice(1000);

        Person person = new Person();
        System.out.println(person);
        person.setName("Taro");
        System.out.println(person);

        person.addPropertyChangeListener(demoListener);
        person.setName("5zm");
        person.setName("Yamada");

        item.removePropertyChangeListener(demoListener);
        person.removePropertyChangeListener(demoListener);
    }
}

3. Résultat de l'exécution

Item [price=0]
Item [price=500]
[Item.price] oldValue:500 -> newValue:700
[Item.price] oldValue:700 -> newValue:1000
Person [name=null]
Person [name=Taro]
[Person.name] oldValue:Taro -> newValue:5zm
[Person.name] oldValue:5zm -> newValue:Yamada

Avant d'ajouter un écouteur avec ʻaddPropertyChangeListener, définir une valeur avec setter` ne fait rien, et après avoir ajouté un écouteur, vous pouvez voir que le contenu modifié est détecté par l'écouteur.

4. Enfin

Cette fois, j'ai expliqué comment détecter qu'une propriété a été modifiée en utilisant l'API Java standard PropertyChangeListener. En utilisant PropertyChangeListener, vous pouvez facilement essayer le traitement des événements sans préparer de bibliothèque spéciale.

Recommended Posts

Java PropertyChangeListener détecte les modifications de propriété
Changements dans Java 11
Changements de Java 8 à Java 11
Notation de version Java qui change dans Java 10