【问题标题】:Differences between anonymous inner classes and local classes [duplicate]匿名内部类和本地类之间的区别[重复]
【发布时间】:2012-10-11 15:30:11
【问题描述】:

可能重复:
Anonymous vs named inner classes? - best practices?

在一般情况下使用 Java Handlers 时,人们经常使用三种方法:

  1. 创建一个将实现所有需要的接口的类
  2. 创建一个anonymous inner class
  3. 创建local class

我只对 2) 和 3) 之间的区别感兴趣

比较 2) 和 3) 我们可以考虑下面的代码。在这个例子中,编译器只会生成一个类

class MyHandler implements ClickHandler, DragHandler, MovedHandler
    {
        public void onClick(ClickEvent clickEvent)
        {
            // Do stuff
        }

        public void onMoved(MovedEvent movedEvent) {
            // Do stuff
        }

        public void onDrag(DragEvent event) {
            // Do stuff
        }
    }

    MyHandler localHandler = new MyHandler();
    button.addClickHandler(localHandler);
    something.addDragHandler(localHandler);
    that.addMovedHandler(localHandler);

在以下示例中,编译器将生成三个内部类(如果我错了,请纠正我)。

button.addClickHandler(new ClickHandler()
    {
        public void onClick(ClickEvent clickEvent)
        {
            // Do stuff
        }
    });
something.addDragHandler(new DragHandler()
    {
        public void onDrag(DragEvent event)
        {
            // Do stuff
        }
    });
that.addMovedHandler(new MovedHandler()
    {
        public void onMoved(MovedEvent movedEvent)
        {
            // Do stuff
        }
    });

我的问题是:这两种方法之间还有其他区别吗?使用其中一个有什么注意事项吗?

【问题讨论】:

  • 一个本地类被命名,可以有多个构造函数,实现多个接口。
  • @Quoi 并不是真正的重复,在这种情况下,我说的是处理程序,以及我们经常需要多个匿名类而没有相同方法的具体事实
  • +1 好的。我也觉得,不完全是。

标签: java class compiler-construction


【解决方案1】:

唯一的区别是示例 1 中的类是命名的,而示例 2 中的类是匿名的。在功能上它们是相同的。

如果你改为声明类

static class MyHandler implements ClickHandler ...

那么您将拥有static nested class which differs from the inner class,因为前者没有引用或直接访问封闭类的方法。

【讨论】:

  • 有人可能会为这个问题添加“尽管使用另一个有什么警告吗?”:命名类是可重用的,匿名类是“一次性的”......这是一个不同的地方而不是警告。
最近更新 更多