持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第32天,点击查看活动详情
下划线和标识符
我们知道可以使用下划线符号作为编程元素标识符的一部分。实际上,要在 Java 中定义标识符,我们可以使用:
- 大写和小写字母
- 数字(但不在标识符的开头)
- 美元符号“$”(实际上从未使用过)
- 下划线符号'
_'
但是,用于定义变量、方法、Java 类型(类、接口、枚举、记录和注释)、包和模块的标识符的标准不需要使用下划线符号。在 Java 编程中,只有常量标识符的标准需要使用下划线符号。事实上,这个标准建议只定义由大写字符组成的名称,并使用下划线符号作为单词分隔符以提高可读性。例如:
final int SIDES_NUMBER_OF_SQUARE = 4; final double PI = 3.14;
这是因为常量必须易于识别,并且通过使用所有大写字符,开发人员能够一眼将常量与变量区分开来。
Java 8 中的新功能
直到Java 8,甚至可以只使用一个下划线符号作为Java编程元素(如变量或方法)的标识符。然而,在版本8中,编译器已经发出了警告,以避免使用这种做法。事实上,如果我们试图用Java 8定义一个变量,例如:
int _;
代码编译正确,但提示了此警告:
warning: '_' used as an identifier
int _;
^
(use of '_' as an identifier might not be supported in releases after Java SE 8)
1 warning
这警告我们,在未来的版本中可能不再支持使用下划线符号作为标识符。
Java 9 中的新功能
事实上,如果我们尝试用高于8的版本编译之前的代码,我们会直接得到如下编译错误:
error: as of release 9, '_' is a keyword, and may not be used as an identifier
int _;
^
1 error
需要注意的是,在此编译器消息中,下划线被定义为关键字,这并不完全正确。Java 中的关键字具有非常特定的含义,例如 class、while 或 instanceof。将下划线定义为保留字会更合适,这是一个对 Java 语法没有特殊含义但不能用作方法标识符的字。该语言定义的其他保留字是 goto 和 const,它们实际上对 Java 语法没有意义,但编译器不接受作为标识符。
但是,可以使用两个或多个连续的下划线作为标识符而没有任何问题。事实上,下面的声明编译没有错误:
int __;
整数类型的下划线
从 Java 8 开始,为了提高分配给数值变量的值的可读性,还可以使用下划线。例如,下面的语句
int i = 1000000000;
可以改写如下:
int i = 1_000_000_000;
明确变量的值i是10 亿。
下划线还可用于提高用其他符号编写的数字类型的可读性。例如,以下使用带有前缀(或)标记的二进制表示法的声明:0b``0B
int bytes = 0b10100001010001011010000101000101
可以通过用下划线分隔各个字节来重写:
int bytes = 0b10100001_01000101_10100001_01000101
很明显,下划线的使用保证了数值具有更大的可读性。
整数类型的其他表示法
还可以用前缀(或)标记的十六进制格式表示整数:0x``0X
long maxLong = 0x7fff_ffff_ffff_ffffL;
甚至是八进制格式的整数,例如将0表征此符号的前缀与八进制数分开,这常常会混淆开发人员的想法:
int octal = 052;
它实际上是一个八进制数,当转换为十进制数时是 42!像这样重写它:
int octal = 0_52;
我们理论上可以使用多个相邻下划线的序列:
int octal = 0__________52;
结论
在本文中,我们探讨了可以在 Java 编程中使用下划线的用例。特别是,我们已经看到,除了要求在声明常量标识符中使用它的标准之外,从 Java 8 开始,可以使用下划线作为数字(整数和小数)的分隔符,以使它们更容易解释。 我们还看到,从 Java 9 开始,我们不能再使用单个下划线作为 Java 编程元素的标识符。