2011-01-22 96 views
3

我是新来的java,我仍然试图理解语言,所以如果这个问题听起来不太好,我很抱歉。了解java中的事件监听器

有件事情我不理解的听众,有时你可以看到这样的方式声明的听众:

private View.OnClickListener onSave=new View.OnClickListener() { 
public void onClick(View v) { 

// Some code 

} 

}; 

或:

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 

的一件事情困扰我最多的是该方法结束后的分号和括号。

我了解内部类为了有多个监听器的目的,但我不明白这个变量和方法的混合声明。

它的目的是什么?

它是如何声明的?

WTF? :P

欢呼:)

+1

与[在Java中如何使用匿名(内部)类)类似? ](http://stackoverflow.com/questions/355167/how-are-anonymous-inner-classes-used-in-java)。 – 2011-01-22 16:54:55

回答

3

通常定义一个类,实例化一个实例,然后使用该实例分别完成:

class MyListener extends OnClickListener { 
    public void onClick(View v) { 
     // my onClick code goes here 
    } 
} 

MyListener foo = new MyListener(); 

button.setOnClickListener(foo); 

但有时你需要一个子类,你将只有一次立即实例化,这是常有的事为事件处理程序。为方便起见,定义它和它一起使用匿名(内)类实例:

OnClickListener foo = 
    new OnClickListener() { 
     public void onClick(View v) { 
      // my onClick code goes here 
     } 
    }; 

button.setOnClickListener(foo); 

但由于foo只使用一次,我们可以借此一步,消除局部变量foo一样,所以:

button.setOnClickListener(foo); 

可以格式化为:在foo

button.setOnClickListener(
    foo 
); 

替代:

button.setOnClickListener(
    new OnClickListener() { 
     public void onClick(View v) { 
      // my onClick code goes here 
     } 
    } 
); 
重新格式化没有一些很大的空白看到它

,因为它往往是写:

button.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     // my onClick code goes here 
    } 
}); 

我想,这最后一种格式伤害可读性。我对我的匿名类进行格式化,类似于下一个格式 - 更好的可读性(恕我直言)值得一点额外的空白。

1

这是一个anonymous inner class。这是一个非常常见和方便的构造。阅读我链接到的教程!

2

打破它......

javax.swing.SwingUtilities.invokeLater(Runnable runnable); 

invokeLater()SwingUtilities一个静态方法,它接受Runnable作为参数。

注意最后的右括号和分号;这只是一个标准方法,对吧?

中间的东西只是创建一个Runnable的新实例传递给方法。你承认它更好,如果我分配到一个参考:

Runnable parameter = new Runnable() 
{ 
    public void run() 
    { 
     createAndShowGUI(); 
     } 
    } 
}; 
+0

您在内部课程结束时忘了分号,但其他答案很好! – 2011-01-22 16:54:28

+0

糟糕,纠正。 – duffymo 2011-01-22 16:58:28

1

该代码适用匿名类。搜索并阅读此主题。

分号分别终止赋值和方法调用。

PS。我一直认为这个名字是误导性的,因为你真正得到的是一个对象。

1

我会尝试举例说明第二个例子。

在这种情况下的invokeLater方法期望任何物体器具Runnable接口。

例如,这是写一样的东西没有一个匿名类的另一种方式:

class Example implements Runnable{ 
    public void run(){ 
    // do something 
    } 
} 

和你的例子是:

javax.swing.SwingUtilities.invokeLater(new Example()); 

但由于本例中类很可能你只会使用一次,使用匿名类更方便。

2

这里没有什么令人费解的分号或括号。基本上,这是一种在Java中分配匿名类的方法。如果你不习惯这种结构,你也可以创建自己的类实现Runnable接口,并为其分配是这样的: -

public class YourRunnableClass implements Runnable { 
    public void run() { 
     ... 
    } 
} 

然后你可以让它看起来更好,就像这样: -

javax.swing.SwingUtilities.invokeLater(new YourRunnableClass()); 

P/S:尽量不要在您的文章中使用“WTF”。 :)