为什么Java中存在匿名类?

3

与普通类相比,匿名类有什么特别的功能吗?因为我在这些类中看不到任何特别之处。


封装和访问控制可能是我猜测的答案。没有其他区别了。 - duffymo
为什么我们不能在匿名类中声明构造函数? - SanthoshPonraj
2
@Santhosh 构造方法使用它的类名。对于没有名称的匿名类,它们无法声明构造方法。 - hata
2
@hata 这不是一个真正的理由,语法总是可以改变以实现我们想要的功能。真正的原因要简单得多:如果你能定义一个构造函数,那么你该如何调用它呢?只有在能够显式地创建类的实例时,构造函数才有意义,但是匿名类的实例化方式只能在定义点进行,因此根本没有必要使用构造函数。 - biziclop
@biziclop 谢谢您的详细解释 :) - hata
2个回答

7
匿名类与普通类相比有什么特殊功能呢?确实有一个特殊的功能:它们具有闭包的语义,这意味着您可以访问在其声明位置上下文范围内的局部变量。匿名类是本地类的一种特殊情况,该类具有相同的功能;但是,几乎从不使用命名的本地类。与“普通”类相比,匿名类也是内部类,这意味着它们还捕获封闭类的实例(如果在非静态上下文中声明)。总之,匿名类是Java类可以拥有的所有特殊功能的结合体。

如果在非静态上下文中声明,这一点不能强调得足够多。我遇到的99%匿名内部类都会不必要地捕获封闭类的实例。大多数情况下它是无害的,但偶尔也会出现问题... - biziclop
3
这是规范的一个不好的方面...它们无条件地捕获它,即使在实现代码中从未使用过。规范本可以更加聪明(就像 lambda 规范一样)。 - Marko Topolnik

0

也许程序员在必须发明 XxxxxListener 的第100个变异体时会非常疲惫,小代码片段不值得。 这是我的个人意见。

我认为匿名类比IDE(如Delphi)中自动生成的名称(combo1、combo2、combo3)更好。 疲惫的程序员会接受这样的名称用于不重要的对象(本地等),但这对于非常重要的对象也是一个非常不好的习惯。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接