Какой эффект имеет значение $в имени класса 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 нарушит эти коды.