【问题标题】:Why anonymous classes exist in Java? [duplicate]为什么 Java 中存在匿名类? [复制]
【发布时间】:2015-09-03 13:33:14
【问题描述】:

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

【问题讨论】:

  • 封装和访问将是我的猜测。没有其他东西可以区分它们。
  • 为什么我们不能在匿名类中声明构造函数?
  • @Santhosh 构造方法使用它的类名。因为匿名类没有它的名字,它们不能声明构造方法。
  • @hata 这不是一个真正的原因,语法总是可以改变来做我们想做的事。真正的原因要简单得多:如果你可以定义一个构造函数,你会如何调用它?仅当您可以显式创建类的实例时,构造函数才有意义,但实例化匿名类的唯一方法是在定义点,因此根本不需要构造函数。
  • @biziclop 谢谢你的精彩解释 :)

标签: java class lambda anonymous-class


【解决方案1】:

与普通类相比,匿名类有什么特殊之处

确实有一个特殊功能:它们具有 闭包 的语义,这意味着您可以在其声明站点访问范围内的局部变量。匿名类是 local 类的特例,具有相同的特性;但是几乎从不使用命名的本地类。

与“普通”类相比,匿名类也是内部类,这意味着它们也捕获封闭类的实例(如果在非静态上下文中声明)。

总而言之,匿名类是 Java 类可以拥有的所有特殊功能的结合。

【讨论】:

  • if declared in a non-static context,这一点怎么强调都不过分。我遇到的 99% 的匿名内部类将不必要地捕获封闭类的实例。大多数时候它是无害的,但时不时地......
  • 这是规范的一个不好的方面......他们无条件地捕获它,即使它从未在实现代码中使用。规范可能会更聪明(如 lambda 规范 is)。
【解决方案2】:

也许程序员会很累,什么时候必须发明XxxxxListener的第100个突变。小sn-ps的代码不值得。这是我个人的看法。

恕我直言,匿名类比 IDE f.e. 中的自动生成名称 combo1、combo2、combo3 更好。德尔福。 累了的程序员接受这样的名称来表示不重要的对象(本地等)但也很重要,这是非常糟糕的习惯

【讨论】:

    猜你喜欢
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多