Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要澄清java中侦听器匿名类的概念_Java_Oop - Fatal编程技术网

需要澄清java中侦听器匿名类的概念

需要澄清java中侦听器匿名类的概念,java,oop,Java,Oop,我是java新手。侦听器匿名内部类设计的目的是什么?我听说匿名类在java中用作侦听器。没有人真正创建内部类,甚至静态内部类。我不知道那是什么意思。有人能解释一下这些概念吗?特别是这个监听器设计,以及它是如何通过匿名类创建的 提前谢谢。事实并非如此,没有人创建命名类来处理事件。但大多数情况下,事件处理程序实际上是匿名类。原因是匿名类提供的代码和要维护的文件更少,而且当您不必在许多小文件之间跳转时,读取代码更容易。匿名类不应太长(即不超过20行代码),如果它们较长,则应将它们转换为命名类。匿名类在

我是java新手。侦听器匿名内部类设计的目的是什么?我听说匿名类在java中用作侦听器。没有人真正创建内部类,甚至静态内部类。我不知道那是什么意思。有人能解释一下这些概念吗?特别是这个监听器设计,以及它是如何通过匿名类创建的


提前谢谢。

事实并非如此,没有人创建命名类来处理事件。但大多数情况下,事件处理程序实际上是匿名类。原因是匿名类提供的代码和要维护的文件更少,而且当您不必在许多小文件之间跳转时,读取代码更容易。匿名类不应太长(即不超过20行代码),如果它们较长,则应将它们转换为命名类。匿名类在低于8的java版本中很常见。java 8中有Lambda表达式,类似于匿名类,但它们更紧凑。

匿名侦听器通常看起来像这样:

myControl.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // Handle event
    }
});
public void init()
{
    myControl.addActionListener(new MyActionListener());
}

private class MyActionListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        // Handle event
    }
}
def myFunction() { //code }

button.onClick(myFunction) 
使用内部类实现相同的目标通常如下所示:

myControl.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // Handle event
    }
});
public void init()
{
    myControl.addActionListener(new MyActionListener());
}

private class MyActionListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        // Handle event
    }
}
def myFunction() { //code }

button.onClick(myFunction) 
现在考虑一下在一个更大的程序的范围内这两个将会是什么样子。匿名侦听器仍然在您添加它的位置。内部类可能完全位于源文件中的其他位置。有了一个好的IDE,这种差异可以最小化(比如一个成员浏览器),但是对于您将要使用一次的东西,真的需要一个全新的类吗

当然,根据应用程序的具体需求,单独的类实际上可能是更好的选择。例如,如果您有许多侦听器,它们之间的差异很小,那么您可以按照以下思路构造一些内容:

public void init()
{
    myControl1.addActionListener(new MyActionListener("foo"));
    myControl2.addActionListener(new MyActionListener("bar"));
    myControl3.addActionListener(new MyActionListener("baz"));
}

private class MyActionListener implements ActionListener
{
    private String word;

    public MyActionListener(String word)
    {
        this.word = word;
    }

    public void actionPerformed(ActionEvent e)
    {
        // Handle event
        System.out.println(word);
    }
}

就静态类而言:在Java中,内部类可以标记为
static
,这样做只是防止它引用封闭类的实例。(例如,
MyProgram.MyStaticClass
将无法访问非静态的
MyProgram
的任何成员,除非它创建了
MyProgram
的新实例)这可能有助于分离关注点,但对于监听器来说变化不大。

在支持第一类函数的语言中,监听器可以这样实现:

myControl.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // Handle event
    }
});
public void init()
{
    myControl.addActionListener(new MyActionListener());
}

private class MyActionListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        // Handle event
    }
}
def myFunction() { //code }

button.onClick(myFunction) 
为简单起见,某些语言能够定义匿名函数(也称为lambdas):

之所以称为“匿名”,是因为不需要名称来引用它,而是就地使用

Java没有第一类函数,而是使用实现某些接口的类来实现侦听器模式:

class myListener implements ButtonListener {
   public void listen(...);
}

button.onClick(myListener)
与匿名函数类似,为了简单起见,java有匿名类的概念,您可以:

button.onClick(new ButtonListener { 
   public void listen(..) { //code }
});
注意:这是一个简单的“说明性”示例,其中包含一个虚构的动态api:p

在Java8中引入了第一类函数(闭包),这是对JavaIMMO的一个巨大且非常好的补充


内部类:有时在另一个类的范围内定义一个类是很好的,这不是最有用的java属性IMMO,我偶尔会使用它,但在其他语言中可以不使用它。

请参阅右侧的一些相关答案,和/或查看有关您试图设置侦听器的任何内容的教程(几乎肯定会有例子)。匿名类是一种方便的速记,仅此而已。是的,在适当的时候使用内部类;学习什么是合适的,什么是不合适的,需要经验和阅读示例。你能找到关于
“没有人真正创建内部类,甚至没有人创建静态内部类"
?很抱歉,但这句话显然是错误的。这就是我听到的。唯一需要内部类的时候是作用域规则。我的印象是静态内部用于限制实例化,但事实并非如此。命名类不必位于单独的文件中;我有时使用命名内部类或名称d静态嵌套类作为侦听器。由于这些类嵌套在另一个类中,因此它们不是单独的文件。为此,我通常使用匿名类,但有时我发现有必要给它们命名。没错,命名类不必位于单独的文件中。您能详细介绍一下静态内部类吗?我认为例如,ught static阻止名为“Wallet.java”的外部类能够实例化许多静态内部“CreditCard”类。我不确定为什么我们实际上会使用静态内部类。@TazMan,不,java中的静态类不是(必要的)singleton。Java中只有内部类可以是静态的,它所做的只是阻止它们引用封闭对象。如果有一个名为
a
MyClass
实例,则
a.MyStaticClass
中没有任何内容引用
a
,除非您将
a
作为参数传递给
a中的一个.MyStaticClass
的方法。在其他语言(如C#)中,静态类的工作方式不同。感谢您的解释。关于您提供的代码示例,我对java中的控件和GUI不太了解。这是唯一使用侦听器的时间吗?您能提供一个更通用的“hello world”吗键入示例以澄清我的疑问?当我看到“控制和操作侦听器”一词时,我完全困惑了,不得不考虑GUI。谢谢。@TazMan,GUI可能是最常用的,但不仅仅限于GUI。链接的wikipedia文章应该可以帮到你的一些困惑:)