私は最近、Google ライブラリ Gson のソース コードを見て、本当に奇妙なもの (IMO) を見ました。com.google.gson.internal パッケージには、「$」で始まる 2 つのクラスがあります。
例えば
public final class $Gson$Types { ... }
ドル記号は開発に影響を与えますか、それとも外部の開発者に「内部クラスなので使用しないでください」などと言うだけですか?
識別子には、任意の通貨記号または継続文字を使用できます。
$ を使用することで、ビルドによって生成された、または内部使用のみのために生成されたことを示唆します。
生成されたクラスと競合する場合にのみ問題が発生します。
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 で許可されていますが、ファイル名としてはサポートされていません。これは、OS と場合によっては言語に依存する場合があります。
コンパイラ/ランタイムの観点からは、G
やs
. 特定のセマンティックな意味はありません。
ただし、言語仕様$
では、識別子に自分で文字を使用しないようにする必要があることが示唆されています。
識別子は、Java 文字と Java 数字の無制限の長さのシーケンスであり、最初の文字は Java 文字でなければなりません。
...
「Java 文字」には、大文字と小文字の ASCII ラテン文字
A
-Z
(\u0041
-\u005a
)、az (\u0061
-\u007a
)、および歴史的な理由から、ASCII アンダースコア (_
、または\u005f
) とドル記号 ($
、または\u0024
) が含まれます。この$
文字は、機械的に生成されたソース コードでのみ使用するか、まれに、レガシー システムの既存の名前にアクセスするために使用する必要があります。
いいえ、それは非常に間違っています。Google はそうすべきではありませんでした。$ 記号は、ネストされたクラスの区切り記号として特に予約されています。JDK を含む多くのコードは、この規則に依存しています (ほとんどの人がこれを守っています)。Google のいたずらな命名方法は、これらのコードを壊してしまいます。