嵌套的静态类名以$开头

时间:2016-11-18 23:42:26

标签: java

我见过一些代码库,人们编写了嵌套的静态类,名称以" $"开头。 ?这有什么意义?

class A {
  int a;

  static class $B {
    int b;  
  }
} 

3 个答案:

答案 0 :(得分:6)

没有意义。 $是java名称的有效字符;它没什么特别的。

JLS Chapter 3.8,它定义了有效的类名字符(或多或少大多数"非语法"字符,第一个字符不是数字)甚至特别警告这种情况:

  

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

另见JLS Chapter 6: Names

这只是一个本地命名约定,可能是为了提醒/指示开发人员该类是内部类。

虽然它是一种风格,AFAICT开发社区的普遍共识是将元数据编码为名称。我见过的其他例子是成员变量/参数的下划线,以及糟糕的Hungarian notation

尝试提供好的未修饰的名称。

答案 1 :(得分:2)

人们通常不会自己写作;那些通常是在某处自动生成的。来自JLS 3.8

  

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

美元符号是一个合法的字符,但它是一个非常强的约定,与使用大写字母的类名称相同,而不是在普通代码中使用它。

少数人用它来表示一个内部类,但我个人从未见过用于任何不带合成标志的$字符,而我会认为它与使用Java中的匈牙利符号相提并论。

答案 2 :(得分:2)

  

那有什么意义?

你必须要求编写代码的人具有重要意义。

然而,从Java语言的角度来看,没有任何意义;即Java编译器对美元符号没有特殊含义。 (它只是另一个合法的标识符字符,虽然您推荐不使用它;请参阅JLS 3.8)。

但是,我怀疑美元字符的原因是:

  • 代码在某些时候已经从字节码中反编译。我这样说是因为Java编译器使用A$B作为B中声明的嵌套类A的合成名称。
  • 从那时起修改/维护它的人/他们要么不了解或不关心标准的Java风格约定。

它也可能是(故意)"地方会议"。

无论哪种方式,大多数Java程序员都会觉得这很令人反感。不要复制它。