java - Java中的匿名类和闭包有什么区别?

标签 java closures terminology anonymous-class

看起来匿名类提供了闭包的基本功能,是这样吗?

最佳答案

几乎没有区别。事实上,关于闭包和对象有句老话。闭包是穷人的对象,对象是穷人的闭包。两者在他们能做的事情上都同样强大。我们只是在表现力上争论。

在 Java 中,我们使用匿名对象对闭包进行建模。实际上这里有一点历史是,最初 Java 有能力在不使用 final 的情况下修改外部范围。这对于在本地方法范围内分配的对象来说工作得很好,但是当涉及到原语时,这引起了很多争议。基元是在堆栈上分配的,因此为了使它们能够在外部方法的执行之后存活,Java 必须在堆上分配内存并将这些成员移动到堆中。那时人们对垃圾收集非常陌生,他们不信任它,因此声称 Java 不应该在没有程序员明确指示的情况下分配内存。为了达成妥协,Java 决定使用 final 关键字。

http://madbean.com/2003/mb2003-49/

现在有趣的是,Java 可以取消该限制并使用 final 关键字 optional 现在每个人都对垃圾收集器更加熟悉,并且从语言的角度来看它可以完全兼容。尽管解决此问题的方法很简单,但可以在匿名对象上定义实例变量,并且您可以随意修改这些变量。事实上,通过编译器将公共(public)实例变量添加到匿名类,并重写源代码以使用这些变量而不是堆栈变量,这可能是一种实现对局部范围的闭包样式引用的简单方法。

public Object someFunction() {
   int someValue = 0;

   SomeAnonymousClass implementation = new SomeAnonymousClass() {
       public boolean callback() {
           someValue++;
       }
   }
   implementation.callback();
   return someValue;
}

将被改写为:

 public Object someFunction() {
   SomeAnonymousClass implementation = new SomeAnonymousClass() {
       public int someValue = 0;

       public boolean callback() {
           someValue++;
       }
   }
   implementation.callback();

   // all references to someValue could be rewritten to 
   // use this instance variable instead.
   return implementation.someValue;
}

我认为人们提示匿名内部类的原因更多地与静态类型和动态类型有关。在 Java 中,我们必须为匿名类的实现者和接受匿名类的代码定义一个约定的接口(interface)。我们必须这样做,以便我们可以在编译时对所有内容进行类型检查。如果我们有第一类函数,那么 Java 需要定义一种语法来声明方法的参数和返回类型作为数据类型,以保持类型安全的静态类型语言。这几乎和定义一个接口(interface)一样复杂。 (一个接口(interface)可以定义多个方法,声明第一类方法的语法只能用于一个方法)。您可以将其视为一种简短的接口(interface)语法。在引擎盖下,编译器可以在编译时将短格式符号转换为接口(interface)。

在不放弃语言或大手术的情况下,可以对 Java 做很多事情来改善匿名类(class)的体验。

关于java - Java中的匿名类和闭包有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6412544/

相关文章:

swift - 可选的绑定(bind)、捕获引用和闭包 [可能的错误]

functional-programming - "flatMap"这个词是从哪里来的?

java - JVM 崩溃报告中的 oop 是什么意思?

java - 在执行完整程序之前按钮不会被移除

java - 检查 Java 中对象/变量类型的最佳方法

java - 防止在 Java 中分配 ArrayList 迭代器

带有 nil 值的 Swift 闭包捕获列表

返回递归函数的 Javascript 闭包

tomcat - SOLR 术语中的文档是什么?

Java 配置框架