Я читаю для SCJP, и у меня есть вопрос относительно этой строки:
Идентификаторы должны начинаться с буквы, символа валюты ($) или соединительного символа, такого как подчеркивание (_). Идентификаторы не могут начинаться с цифры!
В нем говорится, что допустимое имя идентификатора может начинаться с соединительного символа, такого как подчеркивание. Я думал, подчеркивания были единственным допустимым вариантом? Какие еще соединительные символы есть?
java
unicode
identifier
scjp
Счастливчик Люк
источник
источник
_
это «устаревший» идентификатор. В частности, компилятор выдает следующее предупреждение: (использование '_' в качестве идентификатора может не поддерживаться в выпусках после Java SE 8) ._
для использования в будущих языковых функциях . Идентификаторы, которые начинаются со знака подчеркивания, все еще в порядке, но одиночное подчеркивание является ошибкой, если используется как имя параметра лямбда-выражения, и предупреждением везде.. ; [ / < > :
идет: stackoverflow.com/questions/26791204/... docs.oracle.com/javase/specs/jvms/se7/html/... Все остальное является Java-единственное ограничение._, _ -> doSomething();
.Ответы:
Вот список соединительных символов. Это символы, используемые для соединения слов.
http://www.fileformat.info/info/unicode/category/Pc/list.htm
Это компилируется на Java 7.
Пример. В данном случае
tp
это имя столбца и значение для данной строки.Последующий
печать
$ _ ¢ £ ¤ ¥ ؋ ৲ ৳ ৻ ૱ ฿ ៛ ⁀ ⁀ ⁔ ₢ ₢ ₣ ₣ ₥ ₥ ₫ ₫ ₫ ₫ ₭ ₮ ₰ ₰ ₵ ₷ ₷ ₸ ꠸ ︴ ﹍ ﹍ ﹩ $ _ ¢ £ ¥ ₩
источник
int ৲, ¤, ₪₪₪₪;
: Dif( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀)
илиif ($ == $)
илиif (¢ + ¢== ₡)
илиif (B + ︳!= ฿)
переберите все 65 тысяч символов и спросите
Character.isJavaIdentifierStart(c)
. Ответ: "нижнее белье" десятичное 8255источник
(1 to 65535).map(_.toChar).filter(Character.isJavaIdentifierStart).size
- дает 48529 символов ...Character.MAX_CODE_POINT
, что, вероятно, больше, чем2<<16
.Окончательная спецификация допустимого идентификатора Java может быть найдена в Спецификации языка Java .
источник
L
[все]Nl
,Sc
,Pc
.Вот список символов соединителя в Unicode. Вы не найдете их на клавиатуре.
U + 005F LOW LINE _
U + 203F UNDERTIE ‿
U + 2040 CHARACTER TIE ⁀
U + 2054 INVERTED UNDERTIE ⁔
U + FE33 ФОРМА ПРЕЗЕНТАЦИИ ДЛЯ ВЕРТИКАЛЬНОЙ НИЗКОЙ ЛИНИИ ︳
U + FE34 ФОРМА ПРЕЗЕНТАЦИИ ДЛЯ ВЕРТИКАЛЬНОЙ ВОЛНОВОЙ НИЗКОЙ ЛИНИИ ︴
U + FE4 ﹍
U + FE4E ЦЕНТРАЛЬНАЯ НИЗКАЯ ЛИНИЯ ﹎
U + FE4F ВОЛНОВАЯ НИЗКАЯ ЛИНИЯ ﹏
U + FF3F ПОЛНАЯ НИЗКАЯ ЛИНИЯ _
источник
Соединительный символ используется для соединения двух символов.
В Java соединительный символ - это тот, для которого Character.getType (int codePoint) / Character.getType (char ch) возвращает значение, равное Character.CONNECTOR_PUNCTUATION .
Обратите внимание, что в Java информация о символах основана на стандарте Unicode, который идентифицирует соединительные символы, назначая им общую категорию Pc, которая является псевдонимом для Connector_Punctuation. .
Следующий фрагмент кода,
печатает соединительные символы, которые можно использовать для запуска идентификатора на jdk1.6.0_45
Следующие компиляции на jdk1.6.0_45,
По-видимому, вышеприведенное объявление не скомпилируется в jdk1.7.0_80 и jdk1.8.0_51 для следующих двух соединительных символов (обратная совместимость ... упс !!!),
В любом случае, за исключением деталей, экзамен фокусируется только на наборе символов базовой латиницы .
Кроме того , для юридических identifers в Java, спецификация предоставляется здесь . Используйте API класса Character для получения более подробной информации.
источник
Одним из наиболее забавных символов, которые разрешены в идентификаторах Java (но не в начале), является символ Юникода с именем «Zero Width Non Joiner» (& zwnj ;, U + 200C, https://en.wikipedia.org / вики / Zero-width_non-краснодеревщик ).
Я имел это однажды в куске XML внутри значения атрибута, содержащего ссылку на другой кусок этого XML. Поскольку ZWNJ имеет «нулевую ширину», его нельзя увидеть (кроме как при ходьбе с курсором, он отображается прямо на символе раньше). Это также не может быть видно в лог-файле и / или выводе консоли. Но это было все время: скопировать и вставить в поля поиска получили его и, таким образом, не нашли указанную позицию. Набрав (видимую часть) строку в поле поиска, вы найдете указанную позицию. Мне понадобилось время, чтобы понять это.
Ввод Zero-Width-Non-Joiner на самом деле довольно легко (слишком просто) при использовании европейской раскладки клавиатуры, по крайней мере, в ее немецком варианте, например, «Europatastatur 2.02» - это достигается с помощью AltGr + «.», Две клавиши которого к сожалению, на большинстве клавиатур они расположены рядом друг с другом, и их легко можно случайно ударить вместе.
Возвращаясь к Java: я подумал, вы могли бы написать такой код:
со вторым я добавил нулевую ширину без соединения (не могу этого сделать в приведенном выше коде, отредактированном в редакторе stackoverflow), но это не сработало. IntelliJ (16.3.3) не жаловался, но JavaC (Java 8) жаловался на уже определенный идентификатор - кажется, JavaC фактически допускает использование символа ZWNJ как части идентификатора, но при использовании отражения, чтобы увидеть, что он делает, ZWNJ символ удаляется из идентификатора - то, что символы, такие как n't, не являются.
источник
Список символов, которые вы можете использовать внутри своих идентификаторов (а не только в начале), гораздо веселее:
Список:
Включает в себя большинство управляющих символов! Я имею в виду колокола и дерьмо! Вы можете заставить свой исходный код звонить в звонок! Или используйте символы, которые будут отображаться только иногда, например, мягкий дефис.
источник