Java-Créer un événement et un écouteur personnalisés


J'essaie de créer un événement et un écouteur personnalisés en Java. J'ai déjà regardé ces articles et questions:

Créer un événement personnalisé en Java

Gestionnaire d'événements personnalisés Java et écouteurs

Https://www.javaworld.com/article/2077333/core-java/mr-happy-object-teaches-custom-events.html

Mais je ne peux toujours pas vraiment enrouler ma tête autour de lui. C'est ce que je veux faire:

J'ai un objet String dont le contenu change en tant que le programme s'exécute. Je veux pouvoir ajouter un écouteur à la chaîne qui écoute si elle contient une chaîne spécifique et quand elle exécute un morceau de code. Je veux l'utiliser comme ceci:

String string = "";
//String.addListener() and textListener need to be created
string.addListener(new textListener("hello world") {
    @Override
    public void onMatch(
         System.out.println("Hello world detected");
    )
}

//do a bunch of stuff

string = "The text Hello World is used by programmers a lot"; //the string contains "Hello World", so the listener will now print out "Hello world detected"

Je sais qu'il pourrait y avoir des moyens plus faciles de le faire, mais j'aimerais savoir comment le faire de cette façon.

Merci @Marcos Vasconcelos d'avoir souligné que vous ne pouvez pas ajouter de méthodes à un objet String, existe-t-il donc un moyen d'utiliser une classe personnalisée comme @Ben l'a souligné?

Author: Conner Dassen, 2018-03-19

1 answers

J'ai donc fait un exemple minimal qui vous aidera peut-être:

Vous avez besoin d'une interface pour votre auditeur:

public interface MyEventListener
{
    public void onMyEvent();
}

Alors, pour votre Chaîne vous avez besoin d'une classe wrapper qui gère également vos événements

public class EventString
{
    private String                  myString;

    private List<MyEventListener>   eventListeners;

    public EventString(String myString)
    {
        this.myString = myString;
        this.eventListeners = new ArrayList<MyEventListener>();
    }

    public void addMyEventListener(MyEventListener evtListener)
    {
        this.eventListeners.add(evtListener);
    }

    public void setValue(String val)
    {
        myString = val;

        if (val.equals("hello world"))
        {
            eventListeners.forEach((el) -> el.onMyEvent());
        }
    }
}

Vous voyez que le champ myString est privé et accessible uniquement à l'aide de la méthode setValue. C'est pour que nous puissions voir quand notre condition d'événement se déclenche.

Et alors vous n'avez besoin que d'une implémentation de cela, telle que:

EventString temp = new EventString("test");

temp.addMyEventListener(() -> {
    System.out.println("hello world detected");
});

temp.setValue("hello world");
 1
Author: Ben, 2018-03-19 14:44:22