为什么Java在源代码中允许转义的Unicode字符?
为什么Java在源代码中允许转义的Unicode字符?
我最近了解到,在Java源代码中允许使用Unicode,不仅可以使用Unicode字符(例如:double π = Math.PI;
),还可以使用转义序列(例如:double \\u03C0 = Math.PI;
)。
第一种方式对我很有意义,它允许程序员使用自己选择的国际语言来命名变量和方法。然而,我没有看到第二种方法的任何实际应用。
下面是一些代码片段,用Java SE 6和NetBeans 6.9.1测试通过:
这段代码将输出3.141592653589793
public static void main(String[] args) { double π = Math.PI; System.out.println(\u03C0); }
说明:π和\\u03C0是相同的Unicode字符
这段代码将不会输出任何内容
public static void main(String[] args) { double π = Math.PI; /\u002A System.out.println(π); /* a comment */ }
说明:上面的代码实际上编码了:
public static void main(String[] args) { double π = Math.PI; /* System.out.println(π); /* a comment */ }
这将注释掉打印语句。
从我的例子中,我注意到这种语言特性存在几个潜在问题。
首先,糟糕的程序员可能会使用它来秘密地注释掉代码片段,或者创建多个标识相同变量的方法。也许还有其他可怕的事情可以做,我没有想到。
其次,IDE之间似乎缺乏支持。NetBeans和Eclipse都没有为这些例子提供正确的代码高亮显示。实际上,NetBeans甚至标记了一个语法错误(尽管编译没有问题)。
最后,这个特性文档不完整,也不常用。为什么程序员要在他的代码中使用其他程序员无法识别和理解的东西呢?事实上,我甚至找不到关于这个Java隐藏特性的信息。
我的问题是:
为什么Java允许在语法中使用转义的Unicode序列? 有哪些这个特性的\"优点\"使它能够成为Java的一部分,尽管它有很多\"缺点\"?
Unicode转义序列允许你使用纯ASCII来存储和传输源代码,同时又使用整个Unicode字符范围。这有两个优点:
-
没有非ASCII字符被无法处理它们的工具弄坏的风险。在Java设计的早期,这是一个真正的问题。发送包含非ASCII字符的电子邮件且到达时没有被破坏是例外而不是规律。
-
不需要告诉编译器和编辑器/IDE如何解释源代码的编码。这仍然是一个非常合理的问题。当然,一个更好的解决方案应该是在文件头中将编码作为元数据(如XML)存储,但在那时候这还没有成为最佳实践。
第一种变体对我来说是有意义的——它允许程序员使用他们选择的国际语言来命名变量和方法。但是,我没有看到第二个方法的任何实际应用。
两者都会产生完全相同的字节码,具有相同的语言功能。唯一的区别在于源代码。
首先,糟糕的程序员可能会使用它来秘密注释掉代码的某些部分,或者创建识别相同变量的多个方式。
如果你担心程序员故意破坏你代码的可读性,这种语言特性就是你的最小问题。
其次,IDE中似乎缺乏支持。
这不是这种语言特性或它的设计者的过错。但是,我认为它从来没有打算被“手动”使用。理想情况下,IDE将有一个选项,让你正常输入字符并正常显示它们,但自动将它们保存为Unicode转义序列。甚至可能已经有插件或配置选项使IDE以这种方式运行。
但总的来说,这种特性似乎很少被使用,因此可能支持不佳。但是,在1993年左右设计Java的人们怎么可能知道呢?