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é?
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");