27

美元符号 ($) 是命名变量的有效字符,例如String superSecretFormula$;,但是当我们谈论命名约定时,我应该什么时候使用这个符号?

例如下划线主要用于分隔单词,因为不能使用空格。

4

6 回答 6

36

来自标识符的 Java 语言规范

$字符应仅用于机械生成的源代码中,或者很少用于访问遗留系统上预先存在的名称。

于 2012-12-27T15:31:06.010 回答
15

您的问题被标记为 Java,但看起来您在询问type characters,Visual Basic 仍然支持这些类型,但这些天(也不是很长时间)没有广泛使用。

这有点主观,但我认为公平地说:从不

在编写 JavaScript 代码以区分 jQuery 对象时,您可能希望在变量名称前加上前缀。$

编辑

关于以 开头的变量名$Oracle Java 教程告诉我们:

变量的名称可以是任何合法标识符——无限长度的 Unicode 字母和数字序列,以字母、美元符号“ $”或下划线字符“ _”开头。然而,惯例是始终以字母开头变量名,而不是“ $”或“ _”。

于 2012-12-27T15:22:31.240 回答
14

从理论上讲,您可以在变量名中使用美元符号,但强烈建议不要这样做,因为编译器内部会使用该符号(例如内部或匿名类的名称)。

请参考stackoverflow上的两个相关问题:变量名中的$是什么意思?如果存在内部类,则包含美元符号的 Java 类名无法编译

于 2012-12-27T15:28:06.643 回答
5

名称与合成字段冲突

McDowell引用了 JLS,这是一个由于与合成字段的名称冲突而无法在 Oracle JDK 1.8.0_45 上编译的示例:

public class Assert {
    static final boolean $assertionsDisabled = false;
    public static void main(String[] args) {
        assert System.currentTimeMillis() == 0L;
    }
}

问题是javac生成一个字段$assertionsDisabled来实现assert,这与我们的字段冲突,并javac说:

the symbol $assertionsDisabled conflicts with a compile synthesized symbol

另请参阅:Java assert 关键字有什么作用,何时应该使用它?

于 2015-07-11T08:09:22.760 回答
2

我同意,一般来说,应该避免使用特殊符号 $,正如 Richard 所解释的那样但是,我记得在reactor 项目中看到使用 $ 来定义类似 jQuery 的选择器。我认为,谨慎使用 $ 符号有助于在 Java 中定义一些漂亮的 API。

于 2015-10-07T10:49:45.880 回答
1

在 Java 中,我使用“_”作为私有类范围的非静态变量或字段的前缀,并使用“$”作为私有类范围的静态变量的前缀。

它比使用“m”前缀更好,因为它不会阻塞读取行。当你开始阅读变量词时,你显然不会开始阅读“_”或“$”,对吧?像_addressMap$addressMap但在 Map mAddressMap中使用 m时,在您开始阅读它时可能会感到困惑。

尽管它不是传统的 Java 代码,但它对标记这些变量有很大帮助,这样您就可以迅速理解它们是否是类范围的,或者是静态的还是非静态的。当然,您必须与您的队友直接讨论这个问题。

于 2015-04-22T12:18:18.357 回答