使用 unicode 符号作为 Java 标识符是一个好主意吗?

2022-09-01 11:36:36

我有一段代码,看起来像这样:

double Δt = lastPollTime - pollTime;
double α = 1 - Math.exp(-Δt / τ);
average += α * (x - average);

在Java标识符中使用Unicode字符是多么糟糕的想法?还是这是完全可以接受的?


答案 1

出于各种原因,这是一个坏主意。

  • 许多人的键盘不支持这些字符。如果我要在qwerty键盘(或任何其他没有希腊字母的键盘)上维护该代码,我必须一直复制并粘贴这些字符。

  • 某些人的编辑器或终端可能无法正确显示这些字符。例如,一些编辑器(不幸的是)仍然默认使用某些ISO-8859(拉丁语)变体。ASCII仍然如此普遍的主要原因是它几乎总是有效。

  • 即使角色可以正确呈现,也可能会引起混淆。直接从太阳(强调我的):

    具有相同外观的标识符可能但不同。例如,由单字母拉丁大写字母 A (A, \u0041)、拉丁小写字母 A (a, \u0061)、希腊大写字母 ALPHA (A, \u0391)、西里尔字母小写字母 A (a, \u0430) 和数学粗体斜体小 A (a, \ud835\udc82) 组成的标识符都不同。

    ...

    Unicode 复合字符与分解的字符不同。例如,在排序时,可以将拉丁大写字母 A 急性字母 (Á, \u00c1) 视为与拉丁大写字母 A (A, \u0041) 相同,后跟非间距急性字母 (', \u0301),但这些字母在标识符上有所不同。

    这绝不是一个虚构的问题:α(U + 03b1希腊小写字母ALPHA)和⍺(U + 237a APL功能符号ALPHA)是不同的字符!

  • 无法判断哪些字符有效。代码中的字符可以正常工作,但是当我使用函数符号ALPHA时,我的Java编译器抱怨“非法字符:\9082”。即使函数符号在此代码中更合适。除了询问 之外,似乎没有关于哪些字符是可以接受的可靠规则。Character.isJavaIdentifierPart()

  • 尽管您可以对其进行编译,但所有 Java 虚拟机实现是否都经过 Unicode 标识符的严格测试似乎值得怀疑。如果这些字符仅用于方法作用域中的变量,则它们应该被编译掉,但如果它们是类成员,它们最终也会出现在文件中,这可能会破坏错误JVM实现上的程序。.class


答案 2

看起来不错,因为它使用了正确的符号,但是您的团队中有多少人会知道这些符号的击键?

我会使用英语表示,只是为了让它更容易输入。其他人可能没有支持在其PC上设置的这些符号的字符集。


推荐