[英]Java “new” keyword in parameter
最近,我一直在研究许多OOP设计模式,并且遇到了一些以前从未见过的奇怪事情:
Button button = new Button(shell, SWT.PUSH);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// Handle the selection event
System.out.println("Called!");
}
});
具体来说,这是做什么的(例如,“ new”关键字在这里做什么)?
button.addSelectionListener(new SelectionAdapter() {
第二个问题:
private void notifyListeners(Object object, String property, String oldValue, String newValue) {
for (PropertyChangeListener name : listener) {
name.propertyChange(new PropertyChangeEvent(this, "firstName", oldValue, newValue));
}
}
这是观察者设计模式的摘要。 以我的新理解,name.propertyChange(...)创建一个PropertyChangeEvent对象,并通过Java的观察者模式实现,通过将该新对象的信息发送给观察者(或与此类似的事物)来自动通知观察者。 它是否正确?
在这里, new
关键字正在创建一个匿名类。
当您需要一个侦听器来执行某些操作,并且希望将代码分组在一起,并且/或者该类是“一次性”时,这很有用,这意味着它在其他地方没有用。
这是指向匿名类的sun教程的链接 。 所有正常的班级规则均适用。 创建接口时,您需要实现抽象方法或所有方法。
范围稍有不同,因为您可以访问嵌套在您的匿名类中的类中声明的变量。 但是,您不能从匿名类访问局部变量,除非这些局部变量被声明为final。 例如:
Button button = new Button(shell, SWT.PUSH);
final String someString = "hello world!";
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// Handle the selection event
System.out.println(someString);
}
});
如果在更全局的范围内声明someString
则不是这种情况。
关于第二个问题:
是。 您是正确的,这就是代码段中正在发生的事情。 注意到每次都会创建一个新的PropertyChangeEvent
吗? 这样一来,出现在列表前面的侦听器就不会为列表后面出现的项修改PropertyChangeEvent
。
首先,这是Java特定的语法:C#中没有可比的语法,您必须在其中创建一个匿名类扩展object
,或者创建一个命名类的实例。
在Java中,此语法使您可以创建SelectionAdapter
的匿名子类,并在您认为合适的情况下覆盖任何方法。 这等效于创建一个扩展了SelectionAdapter
的命名类,该类将覆盖任何方法,就像在SelectionAdapter()
构造函数调用之后的花括号中所做的那样,然后在addSelectionListener
调用中使用该派生类的名称。 唯一的区别是,此类派生类将具有名称,而示例中的匿名类没有名称*供程序员使用。
*内部匿名类确实具有名称:如果查看Java编译器生成的类文件列表,则可以看到它们。 名称中带有美元符号和数字的文件对应于匿名类。
当您要创建仅使用一次的实例时,此功能很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.