为什么在java中创建自定义事件时使用接口?

为什么在java中创建自定义事件时使用接口?,java,events,interface,Java,Events,Interface,答案显示了在java中创建自定义事件的方法。我理解答案,但我想知道他为什么使用HelloListener界面?我认为没有必要 我的代码: import java.util.ArrayList; import java.util.List; class Initiater { private List<Responder> listeners = new ArrayList<Responder>(); public void addListener(Re

答案显示了在java中创建自定义事件的方法。我理解答案,但我想知道他为什么使用
HelloListener
界面?我认为没有必要

我的代码:

import java.util.ArrayList;
import java.util.List;

class Initiater {
    private List<Responder> listeners = new ArrayList<Responder>();

    public void addListener(Responder toAdd) {
        listeners.add(toAdd);
    }

    public void sayHello() {
        System.out.println("Hello!!");

        for (Responder hl : listeners)
            hl.someoneSaidHello();
    }
}

class Responder {
    public void someoneSaidHello() {
        System.out.println("Hello there...");
    }
}

public class Test {
    public static void main(String[] args) {
        Initiater initiater = new Initiater();
        Responder responder = new Responder();
        initiater.addListener(responder);
        initiater.sayHello();
    }
}
import java.util.ArrayList;
导入java.util.List;
类发起者{
私有列表侦听器=新的ArrayList();
public void addListener(响应程序toAdd){
添加(toAdd);
}
公共空间{
System.out.println(“你好!!”;
用于(响应者hl:侦听器)
有人说:();
}
}
类应答器{
有人说公共空间无效{
System.out.println(“你好…”);
}
}
公开课考试{
公共静态void main(字符串[]args){
启动器启动器=新启动器();
Responder Responder=新的Responder();
Initiator.addListener(响应者);
发起者:sayHello();
}
}

我想我写的代码也做了同样的事情。我可以这样做吗?

你可以这样做,但这不是一个好的设计。使用接口的原因是为了解耦行为。如果您只有一个实现,并且该实现直接从“启动器”引用,则无需使用侦听器。侦听器的目的是将其解耦:“启动器”不知道侦听器可能做什么或侦听器可能是什么(即其类)。因为Java是静态类型的,所以必须定义一个接口。然后,侦听器的实现可以是单独的。它甚至可以在单独的项目中单独编译(例如在创建库时)。

接口将使您能够拥有多种风格的侦听器

interface HelloListener {
    void someoneSaidHello();
}

class Responder implements HelloListener {
    @Override
    public void someoneSaidHello() {
        System.out.println("Hello there...");
    }
}

class AnotherResponder implements HelloListener {
    @Override
    public void someoneSaidHello() {
        System.out.println("Hello from Responder 2");
    }
}

initiater.add(new Responder());
initiater.add(new AnotherResponder());
召唤

initiater.sayHello();
现在将输出

Hello there...
Hello from Responder 2