我应该何时在变量名中使用美元符号($)?

时间:2012-12-27 15:17:56

标签: java naming-conventions

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

例如,下划线最常用于分隔单词,因为不允许使用空格。

6 个答案:

答案 0 :(得分:20)

来自Java Language Specification on identifiers

  

$字符只能用于机械生成的源代码,或者很少用于访问旧系统上预先存在的名称。

答案 1 :(得分:15)

您的问题是标记为Java的,但看起来您问的是type characters,这些仍然在Visual Basic中得到支持,但目前还没有广泛使用(也很长时间)。

这有点主观,但我认为可以说:从不

可能想要使用$为变量名添加前缀的一种情况是将JavaScript代码编写到distinguish jQuery objects

修改

关于使用$启动变量名称,Oracle Java tutorials告诉我们:

  

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

答案 2 :(得分:11)

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

请参阅stackoverflow上的两个相关问题:What is the meaning of $ in a variable name?Java class name containing dollar sign fails to compile if an inner class is present

答案 3 :(得分:3)

名称与合成字段冲突

McDowell quoted the 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

另请参阅:What does the Java assert keyword do, and when should it be used?

答案 4 :(得分:2)

我同意,一般来说,应避免使用特殊符号$ as explained by Richard。但是,我记得在reactor project中看到使用$来定义类似jQuery的选择器。我认为,谨慎使用$符号可以帮助用Java定义一些漂亮的API。

答案 5 :(得分:0)

在Java中,我使用" _"作为私有类的非静态变量或字段的前缀和" $"作为私有类宽静态变量的前缀。

它比使用" m"更好。前缀因为它不会阻止读取行。你显然不会开始阅读" _"或者" $"当你开始阅读变量词时,对吧?与 _addressMap $ addressMap 类似,但在地图 mAddressMap 中使用m 在您开始阅读它时可能会让您感到困惑。

虽然它不是传统的Java代码,但它对标记这些变量有很大帮助,因此如果它们是否属于全班,或者是静态或非静态的,您可以及时理解它们。当然,你必须亲自与你的队友讨论这个问题。