3

我的教授在关于范围和生命周期的练习中提供了这段代码:

class AnonymousInnerClassInMethod {

    public static void main(String[] args) {
        int local = 1;
        Comparable compare = new Comparable () {
            public int compareTo(Object value) {
                return (Integer)value - local;
            }
        };
        System.out.println(compare.compareTo(5));
    }

}

抛开local无法访问的事实(这就是练习)和 Comparable 没有参数化(疏忽?)......我从未见过这个结构,甚至不知道它是可能的。

  1. 这样做是为了避免为整个班级扩展 Comparable 吗?
  2. 如果是这样,为什么?它更容易/可读/其他吗?
  3. 可以为任何接口编写这种类型的匿名类吗?
4

2 回答 2

1

它允许您在使用被隔离和/或依赖于对局部变量的访问的特定情况下使用类并覆盖方法。

是否更容易取决于个人喜好。然而,这意味着一切都在您的代码中,这使您能够了解正在发生的事情,而无需浏览到另一个文件或文件中的另一个位置。在像上面这样的简单情况下,这通常比在代码库中跳转更容易使用。

为了local便于访问,它需要被声明final

具体回答您的问题:

  1. 不; 它是匿名扩展另一个类,因此等同于定义一个扩展另一个类的类,因此适用相同的规则。您必须覆盖任何抽象方法。
  2. 它更具可读性,因为它与需要它的代码位于同一位置。
  3. 是的,任何接口或类。
于 2014-04-02T14:44:27.537 回答
0
  1. 它肯定会影响比较类是否可以在您的主要方法之外访问的范围。
  2. 提高书写能力。恕我直言,以牺牲阅读能力为代价。是的,它现在看起来很简单,但试着读一堂有很多人的课。再次,见仁见智。我们做事的方式通常是从匿名或本地类开始,然后随着可读性的降低而提升它们。然而,它非常适合简单的回调。Oracle 文档提供了一个很好的声明:“如果您只需要使用一次本地类,请使用它们。” 甲骨文文档
  3. 是的。任何接口或抽象类都可以这样使用。
于 2014-04-02T14:45:58.070 回答