Какой эффект имеет значение $в имени класса Java

Недавно я увидел исходный код библиотеки Google Gson и увидел что-то действительно странное (IMO). В com.google.gson.internal пакете есть 2 класса, которые начинаются с "$".

Например

public final class $Gson$Types { ... }

Знак доллара влияет на развитие или просто говорит сторонним разработчикам что-то вроде "пожалуйста, не используйте причину, это внутренний класс"?

Ответ 1

Вы можете использовать любой знак валюты или символ продолжения в идентификаторе.

Используя $, он предполагает, что он генерируется, например. генерируемые сборкой или только для внутреннего использования.

Используется для специальных символов в Java-коде

Скрытый код

Это вызывает только проблему, если у вас конфликты с сгенерированными классами, например.

class A {
     class B {
     }
}
class A$B {
}

Отчеты

error: duplicate class: A.B

Сгенерированные компилятором классы не начинаются с $, что может быть причиной этого.

В 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, но не поддерживаются как имена файлов. Это может зависеть от ОС и, возможно, от языка.

Ответ 2

С точки зрения компилятора/времени выполнения это просто символ, который является частью имени, например, G или s. Он не имеет особого смыслового смысла.

Однако спецификация языка указывает, что вам следует избегать использования символа $ самостоятельно в идентификаторах:

Идентификатор - это неограниченная последовательность букв Java и цифр Java, первая из которых должна быть буквой Java.

...

"Письма Java" включают в себя прописные и строчные латинские буквы ASCII A - Z (\u0041 - \u005a), az (\u0061 - \u007a) и по историческим причинам, подчеркивание ASCII (_ или \u005f) и знак доллара ($, или \u0024). Символ $ следует использовать только в механически сгенерированном исходном коде или, реже, для доступа к уже существующим именам в устаревших системах.

Ответ 3

Нет, это очень неправильно, Google не должен был этого делать. Знак $специально зарезервирован как разделитель во вложенных классах. Многие коды, в том числе JDK, зависят от этого соглашения (что наблюдается почти у всех). google naughty naming practice нарушит эти коды.