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

Eri*_*ric 29 java unicode identifier

我有一段代码如下:

double ?t = lastPollTime - pollTime;
double ? = 1 - Math.exp(-?t / ?);
average += ? * (x - average);
Run Code Online (Sandbox Code Playgroud)

在Java标识符中使用unicode字符的想法有多糟糕?或者这完全可以接受?

Tho*_*mas 34

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

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

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

  • 即使可以正确呈现字符,也可能会造成混淆.直接来自太阳(强调我的):

    具有相同外观的标识符可能会有所不同.例如,标识符包括单个字母LATIN CAPITAL LETTER A(A,\ u0041),LATIN SMALL LETTER A(a,\ u0061),GREEK CAPITAL LETTER ALPHA(A,\ u0391),CYRILLIC SMALL LETTER A(a,\u0430)和MATHEMATICAL BOLD ITALIC SMALL A(a,\ ud835\udc82)都不同.

    ...

    Unicode复合字符与分解的字符不同.例如,拉丁文大写字母A ACUTE(Á,\ u00c1)可被视为与拉丁文大写字母A(A,\ u0041)相同,紧接着是非间距急性(',\ u0301) ,但这些在标识符方面有所不同.

    这绝不是一个想象中的问题:α(U + 03b1 GREEK SMALL LETTER ALPHA)和⍺(U + 237a APL功能符号ALPHA)是不同的字符!

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

  • 即使您可以将其编译,但似乎所有Java虚拟机实现都已使用Unicode标识符进行了严格测试.如果这些字符仅用于方法范围中的变量,那么它们应该被编译掉,但如果它们是类成员,它们也将最终存在于.class文件中,可能会破坏有关错误JVM实现的程序.

  • @BalusC:谢谢,但我觉得你误解了.在`.class`文件的内部,只使用了一个编码,它类似于UTF-8.http://en.wikipedia.org/wiki/Class_%28file_format%29据我所知,`file.encoding`仅用于指定类似`InputStreamReader`的类的默认编码. (4认同)

Mau*_*uro 6

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

我会使用英文表示,以便更容易输入.而其他人可能没有支持在他们的电脑上设置这些符号的字符集.


Cro*_*zin 6

该代码很好读,但很难维护 - 我建议使用简单的英文标识符,如下所示:

double deltaTime = lastPollTime - pollTime;
double alpha = 1 - Math.exp(-delta....
Run Code Online (Sandbox Code Playgroud)


JUS*_*ION 6

如果您的工作组可以接受,那是完全可以接受的.这里的很多答案都是以傲慢的假设运作的,即每个人都用英语编程.非英语程序员这些日子并不罕见,而且他们的加速率也越来越少.当他们拥有完美的语言时,他们为什么要限制自己使用英语版本?

除了英语的傲慢,还有其他合法的理由使用非英语标识符.例如,如果您正在编写数学软件包,那么如果您的目标是数学家,那么使用希腊文就可以了.当每个人都能理解"Δ"并且可能更快地输入时,为什么人们会在你的工作组中输入"delta"?几乎任何问题领域都有自己的行话,有时候行话用拉丁字母表示.为什么在地球上你想尝试将所有东西都塞进ASCII?

  • 问题是Java中的_keywords_是英文的.`if`,`while`,`public`,`class`等,以及运行时库中的所有方法.通过使用另一种语言作为标识符和方法,您会遇到这样一种情况:读者在阅读代码时必须在两种语言之间进行心理连续切换.这比仅使用一种语言更难,即使读者精通两种语言. (5认同)
  • @Longpoke:请指出我所说的"你吸吮因为你只懂英语".(提示:这是不可能的.)地狱,指向我甚至*推断*这个.(提示:这也是不可能的.)然而,我所指出的是,人们说"不要在标识符中使用Unicode,因为它使得难以阅读的内容"正在使**非常傲慢只有说英语的程序员才有的态度.因此"英语国家的傲慢". (4认同)
  • @Thorbjørn:Java中的关键字是伪英语.Java的"if"不是英语的"if".形式逻辑的"如果"只与英语有相似之处."同时","公共","阶级"等也是如此.这些不是文字.它们是符号.我们不会将它们作为英语单词处理.我们将它们处理为仅在Java中具有指定含义的符号(在另一种编程语言中通常具有完全不同的含义!).所以我们在两种语言之间连续切换.通过使用我们的母语中的标识符,这是明确的. (3认同)
  • @ttmrichter,你可能在关键字方面有点正确,但在运行时库中使用的标识符方面却没有.在没有引用运行时库的情况下编写任何非平凡的Java程序几乎是不可能的,并且包含大量的驼峰式英语单词.而且,是的,我是根据个人经验说的.到目前为止,我们已经尝试将丹麦语单词写入Java程序并不是很顺利,我已经得出结论语言切换就是这种情况.唯一的例外是特定领域的概念,没有合理的英文翻译. (2认同)