参数中的Java"new"关键字

Sha*_*aku 7 java oop

我最近一直在寻找很多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!");
    }
}); 
Run Code Online (Sandbox Code Playgroud)

具体来说,这是做什么的(例如,"new"关键字在这里做什么)?:

    button.addSelectionListener(new SelectionAdapter() {
Run Code Online (Sandbox Code Playgroud)

第二个问题:

private void notifyListeners(Object object, String property, String oldValue, String newValue) {
   for (PropertyChangeListener name : listener) {
      name.propertyChange(new PropertyChangeEvent(this, "firstName", oldValue, newValue));
   }
}
Run Code Online (Sandbox Code Playgroud)

这是观察者设计模式的片段.根据我的新理解,name.propertyChange(...)创建了一个PropertyChangeEvent对象,并通过Java的观察者模式实现,通过将这个新对象的信息发送给观察者(或者与此非常相似的东西)自动通知观察者.它是否正确?

Wil*_*son 23

这里,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);
    }
});
Run Code Online (Sandbox Code Playgroud)

如果someString在更全球范围内宣布,则情况并非如此.

对于你的第二个问题:

是.你是对的,这就是代码片段中发生的事情.注意PropertyChangeEvent每次都会创建一个新的?因此,列表中较早出现的侦听器不会修改列表PropertyChangeEvent中稍后出现的for项目.

  • 好答案!+1 (2认同)