为什么isJavaLetterOrDigit已被弃用?

5
为什么java.lang.Character中的方法isJavaLetterOrDigit被弃用?
文档显示应使用isJavaIdentifierPart方法,但没有说明原因。这两种方法的文档描述是相同的。通过谷歌搜索也未能找到任何解释。
实际上,源代码搜索显示,今天只需要调用另一个方法即可,因此行为没有区别。它是否只是因为名称更加混乱而被弃用?看起来是一个非常奇怪的决定。
@Deprecated
public static boolean isJavaLetterOrDigit(char ch) {
    return isJavaIdentifierPart(ch);
}
2个回答

5
旧的(已弃用)名称不能正确反映实际执行的操作;例如,它接受既不是字母也不是数字的字符。我想这可能导致一些困惑的开发人员报告"错误"和支持请求。我认为这是他们采取创建新方法和弃用旧方法的(重大)步骤的最有可能的原因。无论如何,废弃此方法似乎是一个明显而明智的API设计决策,是基于正确的理由做出的。无论如何,我们的意见都没有什么意义。

5

原因1:

一个好的API名字应该抽象一些(但不要太抽象)。isJavaLetterOrDigit过于着眼于实现。如果这确实是您想要的,请改用isLetterOrDigit

原因2:

一个好的API名称应该准确地指定其目的并正确实现。 isJavaLetterOrDigit是误称,因为它实际上允许非字母或数字字符,例如“_”或“$”。

原因3:

一个好的API名称应该与其他API协调。 isJavaIdentifierPart与其他API(如isJavaIdentifierStartisUnicodeIdentifierPartisIdentifierIgnorable)保持一致。

最后,仅因为这两个API之间没有行为差异并不意味着它们是相同的。具有误导性的API名称会损害您的代码。此外,尽快摆脱弃用的API,因为它们最终(或极有可能)会被库提供商弃用。


1
由于二进制兼容性原因,他们不能被库提供者所“抛弃”。 - user207421
@EJP 我知道出于兼容性的原因,弃用的API通常会保留一段时间。但从长远来看,库提供者可能会选择打破这种兼容性。无论如何,我们不想冒这个风险。 - Hui Zheng
1
@HuiZheng - 根据过去的历史,该方法不会被删除。这对于Oracle或其(付费)客户来说都不利。文档中说可能会发生...但我预测不会发生。(或者至少在源代码和字节码级别上Oracle能够提供可靠的自动升级旧代码工具之前不会发生。) - Stephen C
@Antimony - 表面上看是的,就像这种简单情况。但你还必须考虑到对其余工具链的影响;例如调试器、分析器。而且还有反射代码和安全管理器的影响。所有这些都加起来构成了一个相当复杂的问题。 - Stephen C
没错,Java是一种非常非常向后兼容的语言,JDK很少删除弃用的方法,但它仍然不是100%向后兼容(例如http://www.math.uni-hamburg.de/doc/java/tutorial/post1.0/converting/incompatibleChangesAWT.html)。此外,我们不希望在各个地方都有`@SuppressWarnings("deprecation")`的东西。 - Hui Zheng
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接