Java - 创建自定义事件和监听器

3

我正在尝试在Java中创建自定义事件和监听器。 我已经查看了以下文章和问题:

在Java中创建自定义事件

Java自定义事件处理程序和监听器

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

但我仍然无法真正理解它。这是我想要完成的内容:
我有一个String对象,其内容随程序运行而更改。我希望能够向该字符串添加侦听器,以监听它是否包含特定字符串,当它包含时运行一段代码。我想像这样使用它:
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"

我知道可能有更简单的方法来完成这个任务,但我想知道如何用这种方式来实现。
谢谢@Marcos Vasconcelos指出,你不能向String对象添加方法,那么我可以像@Ben指出的那样使用自定义类吗?

你不能向String添加方法,但可以将它添加到你使用的类中。 - Marcos Vasconcelos
你可以使用 Kotlin 及其扩展来完成这个任务。在 Java 中,一个包装类和一个关于事件的 Java 101 教程就可以实现它。 - duffymo
你可以创建自己的类EventString(或其他名称),在其中拥有一个字符串对象,然后为其实现自定义事件监听器。 - Ben
基本上,事件监听器并不是魔法。为了使监听器起作用,您需要编写一个机制来触发事件,当发生更改时。也就是说,您不能允许程序直接分配给字符串 - 您必须通过该机制来完成。 - RealSkeptic
这是一个简单的双重过程。你需要一些接口 MyEventListener,其中包含一个方法 onMyEvent。然后在你的 EventString 类中有一个 addMyEventListener(MyEventListener) 方法,它保存了对监听器的引用。当发生任何你想要发生的事情时(例如,在你的 setValue 方法中,值 hello world 是参数),你就可以为你的监听器调用 onMyEvent 方法。 - Ben
显示剩余2条评论
1个回答

7
所以我制作了一个最小化的例子,也许这会帮到你:
你需要为你的监听器创建一个接口:
public interface MyEventListener
{
    public void onMyEvent();
}

那么对于您的字符串,您需要一些包装类来处理您的事件。
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());
        }
    }
}

你会发现myString字段是私有的,只能通过setValue方法访问。这是为了我们能够看到事件条件何时触发。
然后你只需要一些实现,例如:
EventString temp = new EventString("test");

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

temp.setValue("hello world");

有没有一种方法可以在调用 setValue 时不进行检查,而是持续进行检查?也许可以使用 while 循环? - Conner Dassen
你可以在任何时候触发事件。只需使用 eventListeners.forEach((el) -> el.onMyEvent()); 这一行即可。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接