11

我最近看到了谷歌库 Gson 的源代码,看到了一些非常奇怪的东西(IMO)。在 com.google.gson.internal 包中有 2 个以“$”开头的类。

例如

public final class $Gson$Types { ... }

美元符号对开发有影响,还是只是对外部开发人员说“请不要使用,因为它是一个内部类”?

4

3 回答 3

8

您可以在标识符中使用任何货币符号或连续字符。

通过使用 $,它表明它是生成的,例如由构建生成的,或者仅供内部使用。

Java 代码中特殊字符的用途

隐藏代码

如果您与生成的类发生冲突,它只会导致问题,例如

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 允许使用其他特殊字符,但不支持作为文件名。这可能取决于操作系统,也可能取决于语言。

于 2012-09-20T16:01:05.897 回答
1

从编译器/运行时的角度来看,它只是一个构成名称一部分的字符,例如 theGs. 它没有任何特定的语义含义。

但是,语言规范确实暗示您应该避免$自己在标识符中使用该字符:

标识符是 Java 字母和 Java 数字的无限长度序列,其中第一个必须是 Java 字母。

...

“Java 字母”包括大写和小写 ASCII 拉丁字母A- Z( \u0041- \u005a) 和 az ( \u0061- \u007a),以及出于历史原因的 ASCII 下划线 ( _, or \u005f) 和美元符号 ( $, or \u0024)。该$字符应仅用于机械生成的源代码中,或者很少用于访问遗留系统上预先存在的名称。

于 2012-09-20T16:00:47.317 回答
-1

不,这是非常错误的,谷歌不应该这样做。$ 符号专门保留为嵌套类中的分隔符。许多代码,包括 JDK,都依赖于这个约定(几乎每个人都遵守)。谷歌顽皮的命名习惯会破坏这些代码。

于 2012-09-20T16:34:26.513 回答