【问题标题】:java valid identifier from java language specificationjava语言规范中的java有效标识符
【发布时间】:2015-11-02 22:13:00
【问题描述】:

SO 上的许多地方都指向 Identifiers 上的 JLS 部分,但我对那里写的内容有疑问。

“Java 字母”包括大写和小写的 ASCII 拉丁字母 A-Z (\u0041-\u005a) 和 a-z (\u0061-\u007a),以及,对于历史 原因,ASCII 下划线(_,或 \u005f)和美元符号($,或 \u0024)。 $ 字符只能用于机械生成 源代码,或者很少访问旧版上已有的名称 系统。 “Java 数字”包括 ASCII 数字 0-9 (\u0030-\u0039)。

但它继续说:

字母和数字可能来自整个 Unicode 字符集, 它支持当今世界上使用的大多数书写脚本, 包括中文、日文和韩文的大套装。这个 允许程序员在他们的程序中使用标识符 用他们的母语写成。

我不明白这两个怎么可能都是真的。第一部分似乎明确规定了允许哪些字符,而第二部分似乎说允许更灵活。

我同意使用“包含”而不是“包含但不限于”表明它并不完全矛盾。但它也首先专门指“Java 字母”/“Java 数字”,然后将其放宽为“字母”/“数字”。我的主要观点是不够清晰,我想确认我认为的意思。

【问题讨论】:

  • 你在哪里看到了矛盾?支持拉丁字母、一些符号、数字,现在还支持一些 Unicode 字符。
  • 好的。诚然这没有错,但我仍然认为它具有误导性/不清楚。您是否同意 cui.unige.ch/isi/bnf/JAVA/identifier.html 正确且完整地代表了规范所说的内容?

标签: java identifier


【解决方案1】:

根据问题Legal identifiers in Java 可以看到有很多合法的标识符。

[对于使用罗马字母的语言] 在按约定命名标识符时仅使用字母数字字符,偶尔使用下划线。但是,可以使用大量字符。

第一段是指 Java 程序员使用合理一致和可读的命名方案的代码风格或约定。您引用的第二段解释说 JVM 将接受大量其他字符 - 尽管您的程序员同行可能不赞成。

【讨论】:

    【解决方案2】:

    第一部分是第二部分的特例,两个部分中提到的字符都必须满足JLS 3.8 中提到的标准,此处省略,

    “Java 字母”是 Character.isJavaIdentifierStart(int) 方法返回 true 的字符。 “Java 字母或数字”是该方法所针对的字符 Character.isJavaIdentifierPart(int) 返回 true。

    上述方法接受/验证与整个 Unicode 字符集(第 2 节)中的字符对应的代码点,其中包括基本拉丁字符集(第 1 节)。

    通常,您永远不会看到任何人在其 Java 源文件中超出 Basic-Latin 字符集。

    【讨论】: