我最近看到了谷歌库 Gson 的源代码,看到了一些非常奇怪的东西(IMO)。在 com.google.gson.internal 包中有 2 个以“$”开头的类。
例如
public final class $Gson$Types { ... }
美元符号对开发有影响,还是只是对外部开发人员说“请不要使用,因为它是一个内部类”?
您可以在标识符中使用任何货币符号或连续字符。
通过使用 $,它表明它是生成的,例如由构建生成的,或者仅供内部使用。
如果您与生成的类发生冲突,它只会导致问题,例如
class A {
class B {
}
}
class A$B {
}
报告
error: duplicate class: A.B
编译器生成的类不以 a 开头,$
这可能是这样做的原因。
在 Windows 7 上,可以出现在类中的特殊字符是
public static void main(String... args) throws IOException {
for (char ch = 0; ch < Character.MAX_VALUE; ch++) {
if (Character.isJavaIdentifierStart(ch) && !Character.isLetter(ch))
System.out.println("interface " + ch + " { }");
}
}
interface $ { }
interface _ { }
interface ¢ { }
interface £ { }
interface ¤ { }
interface ¥ { }
interface € { }
Java 允许使用其他特殊字符,但不支持作为文件名。这可能取决于操作系统,也可能取决于语言。
从编译器/运行时的角度来看,它只是一个构成名称一部分的字符,例如 theG
或s
. 它没有任何特定的语义含义。
但是,语言规范确实暗示您应该避免$
自己在标识符中使用该字符:
标识符是 Java 字母和 Java 数字的无限长度序列,其中第一个必须是 Java 字母。
...
“Java 字母”包括大写和小写 ASCII 拉丁字母
A
-Z
(\u0041
-\u005a
) 和 az (\u0061
-\u007a
),以及出于历史原因的 ASCII 下划线 (_
, or\u005f
) 和美元符号 ($
, or\u0024
)。该$
字符应仅用于机械生成的源代码中,或者很少用于访问遗留系统上预先存在的名称。
不,这是非常错误的,谷歌不应该这样做。$ 符号专门保留为嵌套类中的分隔符。许多代码,包括 JDK,都依赖于这个约定(几乎每个人都遵守)。谷歌顽皮的命名习惯会破坏这些代码。