本问题已经有最佳答案,请猛点这里访问。
我的教授在有关范围和生存期的练习中提供了以下代码:
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进行参数化(监督?)的事实……我从未见过这种构造,甚至不知道它是不可能的。
是否这样做避免在整个类中扩展Comparable?
如果是这样,为什么? 这更容易/可读/其他吗?
可以为任何接口编写此类匿名类吗?
@ user3301492:是的
它允许您在使用被隔离和/或依赖于访问局部变量的特定情况下使用类并覆盖方法。
是否更容易在一定程度上取决于个人喜好。但是,这意味着代码中的所有内容都就位,这使您无需浏览到另一个文件或文件中的其他位置即可了解正在发生的情况。在像上面这样的简单情况下,通常比在代码库中跳转要容易得多。
为了使local易于访问,需要将其声明为final。
具体回答您的问题:
没有;它是匿名扩展另一个类,因此等效于定义一个扩展另一个类的类,因此适用相同的规则。您必须重写任何抽象方法。
它更具可读性,因为它们都与需要它的代码位于同一位置。
是的,任何接口或类。
无论是否可以在您的main方法之外访问比较类,这肯定会影响范围。
增加的可写性。恕我直言,以可读性为代价。是的,现在看起来很简单,但是请尝试阅读其中的很多课程。再次,见仁见智。我们的工作方式通常是从匿名或本地类开始,然后随着可读性的降低而提升它们。但是,它对于简单的回调非常有用。 Oracle文档提供了一个很好的声明:"如果只需要使用一次本地类,则使用它们。" Oracle文档
是。任何接口或抽象类都可以通过这种方式使用。