为了账号安全,请及时绑定邮箱和手机立即绑定

Java双括号初始化与lambda

Java双括号初始化与lambda

紫衣仙女 2022-10-20 17:00:33
如果您搜索“java 双括号”,您会发现反对使用它的有力论据。每次有人使用双括号初始化时,都会杀死一只小猫。 https://stackoverflow.com/a/27521360/555631论点是您创建了太多匿名类,并且您可能会造成内存泄漏。lambdas有什么不同吗?他们每个人都创建了一个匿名内部类,他们每个人都引用了它们的封闭闭包。
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

Lambda 表达式不同于碰巧实现函数式接口的匿名内部类。

匿名内部类将在编译时创建自己的类文件Foo$1.class,如果它包含在Foo类中,通常类似于 。它是实现接口或子类的全功能类。要在其范围之外引用本地值,它将在幕后在匿名内部类中创建一个实例变量,该变量表示该值的副本。这就是为什么变量必须是有效的最终变量——否则实际变量可能会改变并且副本可能是陈旧的。

Lambda 表达式不创建匿名内部类。他们使用 ajava.lang.invoke.LambdaMetafactory来生成 a CallSite,稍后可以使用它来执行 lambda 表达式。lambda 表达式,无论是块还是表达式,都被转换为包含它的类中的隐藏私有静态方法。不是创建具有隐藏变量的类,而是将捕获的值转换为隐藏的私有静态方法的参数。局部值仍然必须是有效的最终值,因为传递给方法的值又是一个副本。invokedynamic该方法由JVM 中的指令调用。


查看完整回答
反对 回复 2022-10-20
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

是的,它们是不同的。

  • Lambda 实际上并不一定要创建匿名类——它们当然不只是被翻译成等效的匿名类。它们的创建比这要复杂得多,并且通常以在运行时创建的匿名类结束,但不一定。

  • Lambda 不捕获除了其中特别提到的变量之外的任何内容,这与匿名内部类不同,如果它们是在实例方法中定义的,则会捕获封闭的类对象。


查看完整回答
反对 回复 2022-10-20
  • 2 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信