16

总的来说,我对Java-11很好奇,但特别是JEP:323,它计划将var声明添加到 Lambda 操作变量中。

此处很好地讨论了此功能背后的动机。考虑文章中的以下引用:

// #1 - Legal
ITest divide = (@ATest var x, final var y) ->  x / y;
/* #2 Modifiers on Old-Style implicit paramaters => Illegal */
ITest divide = (@ATest x, final y) ->  x / y;

final 修饰符的用法对我来说很清楚,并且符合不变性最佳实践。

但是,我不确定注释。能够注释 lambda 隐式参数有什么好处?

您能否提供一个在 lambda 操作变量上使用注释的事实上的有益示例?不是意见问题,而是作为使用此功能时更具可读性或效率的代码的实际示例。

4

1 回答 1

8

能够注释 lambda 隐式参数有什么好处?

lambda 语句中注释的使用应该类似于非 lambda 语句中的任何其他属性。这可能是利用:

  • 在运行时反射并推断出一些关于被注释对象的信息。
  • 也在编译时描述行为,例如生成的源代码或其他工具提示

JEP-323本身中说明的一个用例(重申自己不确定这是否是您所期待的)-

(@Nonnull var x, @Nullable var y) -> x.process(y)

其中,库可以使用注释来确定对x和的值检查y。在那,你知道如果现在不进行显式空检查,x.process(y)肯定不能抛出 NullPointerException ,这与任何其他显式注释的非 lambda 参数相同。x

值得注意的是,这是引入允许var隐式类型 lambda 表达式的形式参数的一致性的好处之一。

于 2018-05-08T06:47:06.290 回答