跳到主要内容

JEP 213:铣削项目硬币

概括

作为 JDK 7 / Java SE 7 一部分的 Project Coin / JSR 334中包含的小语言更改非常易于使用,并且在实践中效果良好。然而,一些修正案可以解决这些变化的粗糙边缘。此外,使用下划线 ( "_") 作为标识符,从 Java SE 8 开始会生成警告,但在 Java SE 9 中应转为错误。还建议允许接口具有私有方法。

非目标

本 JEP 并不提议开展“Coin 2.0”工作或广泛征求新语言提案。

描述

建议对 Java 编程语言进行五项小修改:

  1. 允许在私有实例方法上使用@SafeVargs。注解@SafeVarargs只能应用于不能被重写的方法,包括静态方法和最终实例方法。私有实例方法是 @SafeVargs 可以适应的另一个用例。

  2. 允许将有效最终变量用作 try-with-resources 语句中的资源。 Java SE 7 中 try-with-resources 语句的最终版本要求为该语句管理的每个资源声明一个新变量。这是该功能早期版本的一项更改。JSR 334 的公共审查草案讨论了对 try-with-resource 的早期审查草案版本进行更改的基本原理,该版本允许由语句管理表达式。 JSR 334 专家组赞成对 try-with-resources 进行额外的改进:如果资源由最终或有效最终变量引用,则 try-with-resources 语句可以在不声明新变量的情况下管理资源。这种由 try-with-resources 语句管理的受限表达式避免了导致删除通用表达式支持的语义问题。当专家组决定进行此改进时,发布时间表没有足够的时间来适应更改。

  3. 如果推断类型的参数类型是可表示的,则允许使用匿名类使用 Diamond。由于使用 Diamond 和匿名类构造函数推断的类型可能超出了签名属性支持的类型集,因此 Java SE 7 中不允许使用 Diamond 和匿名类。正如 JSR 334提议的最终草案中所述,这将是如果推断的类型是可表示的,则可以缓解此限制。

  4. 从 Java SE 8 开始,完成从合法标识符名称集中删除下划线的工作。

  5. 作为添加对 Lambda 表达式支持的一部分,曾短暂考虑将对接口中私有方法的支持纳入 Java SE 8,但为了更好地关注 Java SE 8 的更高优先级任务而将其撤回。现在建议支持采取私有接口方法,从而使接口的非抽象方法能够在它们之间共享代码。

在 Java 语言的变化空间中,这些改进都是非常小的变化。更改@SafeVarags可能只涉及更改规范中的一两句话,并在 中进行类似大小的更改javac。然而,与任何 Java 语言更改一样,必须小心处理需要更新的平台的所有部分。

测试

语言更改需要对 进行通常的单元和回归测试javac。 JCK 编译器套件需要更新,包括正面测试和负面测试。