2016-11-18 94 views
-1

开头我已经看到一些代码库,其中有人写过名称以“$”开头的嵌套静态类?那有什么意义呢?

class A { 
    int a; 

    static class $B { 
    int b; 
    } 
} 
+0

不是自动生成的。 – nibin012

+0

然后生成一个真实的例子。 – chrylis

+0

相关,可能是间接重复:http://stackoverflow.com/questions/19529603/any-risk-using-a-single-dollar-sign-as-a-java-class-name –

回答

6

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

JLS Chapter 3.8,它定义有效的类名称的字符(更多或更少的最“非语法”字,第一个字符不是一个数字)甚至专门提醒注意这个特别的情况:

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

也请参阅JLS Chapter 6: Names

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

虽然这是一种风格的东西,但AFAICT开发者社区的普遍共识是而不是将元数据编码成名称。我看到的其他例子是成员变量/参数的前导下划线,以及可怕的Hungarian notation

尽量让事情好undecorated名称。

2

人们一般都没有自己写过;这些通常是自动生成的。从JLS 3.8

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

的美元符号是一个合法的字符,但它是一个非常公约看齐,与使用大写字母作为类名,不能在普通的代码中使用它。

极少数人用它来表示一个内部类,但我个人从来没有一次看到用于任何的$字符也没携带合成标志,我会用匈牙利语考虑看齐Java中的符号。

2

那是什么意思?

你将不得不问问编写代码的人员的重要性。

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

不过,我嫌疑认为,美元字符是否是原因:

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

它也可能是(故意的)“本地公约”。

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