JEP 213: Milling Project Coin
摘要
作为 JDK 7 / Java SE 7 的一部分,项目硬币(Project Coin)/ JSR 334 包含的小语言改变已经很容易使用,并且在实践中运行良好。然而,一些修正可以解决这些改变的一些问题。此外,在 Java SE 9 中,应该将下划线("_")作为标识符使用的警告转换为错误。还建议允许接口拥有私有方法。
非目标
本 JEP 不提议进行"硬币 2.0"工作或者广泛征求新的语言提议。
描述
提议对 Java 编程语言进行五个小修改:
允许 @SafeVarargs 用于私有实例方法。
@SafeVarargs
注解只能应用于无法被覆盖的方法,包括静态方法和最终实例方法。私有实例方法是@SafeVarargs
可以处理的另一个用例。允许将 effectively-final 变量用作 try-with-resources 语句中的资源。Java SE 7 中的 try-with-resources 语句的最终版本要求为语句管理的每个资源声明一个新变量。这与之前的功能设计有所不同。JSR 334 的公开评审草案讨论了从早期设计版本中允许语句管理的表达式的变更原因。JSR 334 专家组赞成进一步完善 try-with-resources:如果资源由一个 final 或 effectively-final 变量引用,那么 try-with-resources 语句可以管理该资源而无需声明新变量。此限制表达式被 try-with-resources 语句管理避免了之前存在的导致移除通用表达式支持的语义问题。当专家组确定这一改进时,发布计划中的时间不足以适应变更。
允许在匿名类中使用钻石操作符(diamond)如果推断类型的参数类型可指定。因为使用匿名类构造函数的钻石操作符推断的类型可能位于签名属性支持的类型集合之外,所以在 Java SE 7 中禁止使用钻石操作符与匿名类。如 JSR 334 拟定的最终草案中所述,如果推断的类型是可指定的,则可以放宽此限制。
支持接口中的私有方法最初被考虑包含在 Java SE 8 中,作为添加对 Lambda 表达式支持的努力的一部分,但之后被取消以更好地专注于 Java SE 8 的优先任务。现在建议进行对支持私有接口方法的实现,从而使接口的非抽象方法之间可以共享代码。
在 Java 语言变更领域,这些改进是非常小的变动。@SafeVarags
变更可能只涉及规范的一两句话和 javac 中类似大小的更改。然而,与任何 Java 语言变更一样,必须小心处理需要更新的平台的所有组件。
测试
这些语言变更需要对 javac 进行常规的单元测试和回归测试。需要更新 JCK 编译器套件,包括正面测试和负面测试。