Czytam SCJP i mam pytanie dotyczące tej linii:
Identyfikatory muszą zaczynać się od litery, znaku waluty ($) lub znaku łączącego, takiego jak znak podkreślenia (_). Identyfikatory nie mogą zaczynać się cyfrą!
Stwierdza, że poprawna nazwa identyfikatora może zaczynać się od łączącego znaku, takiego jak znak podkreślenia. Myślałem, że podkreślenia to jedyna ważna opcja? Jakie są inne łączące się postacie ?
java
unicode
identifier
scjp
Lucky Luke
źródło
źródło
_
jest to „przestarzały” identyfikator. W szczególności kompilator emituje następujące ostrzeżenie: (użycie „_” jako identyfikatora może nie być obsługiwane w wersjach późniejszych niż Java SE 8) ._
do wykorzystania w przyszłych funkcjach językowych . Identyfikatory zaczynające się od znaku podkreślenia są nadal w porządku, ale pojedynczy znak podkreślenia jest błędem, jeśli jest używany jako nazwa parametru lambda i ostrzeżenie wszędzie indziej.. ; [ / < > :
to: stackoverflow.com/questions/26791204/… docs.oracle.com/javase/specs/jvms/se7/html/… Wszystko inne jest ograniczeniem tylko do języka Java._, _ -> doSomething();
.Odpowiedzi:
Oto lista łączących się postaci. Są to znaki używane do łączenia słów.
http://www.fileformat.info/info/unicode/category/Pc/list.htm
To kompiluje się w Javie 7.
Przykład. W tym przypadku
tp
jest to nazwa kolumny i wartość dla danego wiersza.Następujące
odciski
$ _ ¢ £ ¤ ¥ ؋ ৲ ৳ ৻ ૱ ௹ ฿ ៛ ‿ ⁀ ⁔ ₠ ₡ ₢ ₣ ₤ ₤ ₥ ₦ ₨ ₨ ₫ ₫ ₭ ₭ ₮ ₮ ₯ ₰ ₰ ₲ ₳ ₳ ₴ ₵ ₶ ₶ ₷ ₸ ₹ ꠸ ﷼ ﷼ ︳ ︴ ﹍ ﹎ ﹏ ﹩ $ _ ¢ £ ¥ ₩
źródło
int ৲, ¤, ₪₪₪₪;
: Dif( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀)
lubif ($ == $)
lubif (¢ + ¢== ₡)
lubif (B + ︳!= ฿)
iteruj przez wszystkie 65 000 znaków i pytaj
Character.isJavaIdentifierStart(c)
. Odpowiedź brzmi: „podjąć” dziesiętnie 8255źródło
(1 to 65535).map(_.toChar).filter(Character.isJavaIdentifierStart).size
- daje 48529 znaków ...Character.MAX_CODE_POINT
, co prawdopodobnie jest więcej niż2<<16
.Ostateczną specyfikację legalnego identyfikatora Java można znaleźć w specyfikacji języka Java .
źródło
L
[wszystko]Nl
,Sc
,Pc
.Oto lista znaków łącznika w standardzie Unicode. Nie znajdziesz ich na klawiaturze.
U + 005F LOW LINE _
U + 203F UNDERTIE ‿
U + 2040 CHARACTER TIE ⁀
U + 2054 INVERTED UNDERTIE ⁔
U + FE33 FORMULARZ
PREZENTACJI DLA PIONOWEJ NISKIEJ LINII ︳ U + FE34 FORMULARZ PREZENTACJI DLA PIONOWEJ FALISTEJ NISKIEJ LINII ︴
U + FE4D DED ﹍
U + FE4E CENTRELINE LOW LINE ﹎
U + FE4F WAVY LOW LINE ﹏
U + FF3F FULLWIDTH LOW LINE _
źródło
Znak łączący służy do łączenia dwóch znaków.
W Javie łączącym znakiem jest ten, dla którego Character.getType (int codePoint) / Character.getType (char ch) zwraca wartość równą Character.CONNECTOR_PUNCTUATION .
Zauważ, że w Javie informacje o znakach są oparte na standardzie Unicode, który identyfikuje łączące się znaki, przypisując im ogólną kategorię Pc, która jest aliasem dla Connector_Punctuation .
Poniższy fragment kodu,
wypisuje znaki łączące, których można użyć do uruchomienia identyfikatora na jdk1.6.0_45
Następujące kompilacje na jdk1.6.0_45,
Najwyraźniej powyższa deklaracja nie kompiluje się na jdk1.7.0_80 i jdk1.8.0_51 dla następujących dwóch łączących się znaków (kompatybilność wsteczna ... ups !!!),
W każdym razie, pomijając szczegóły, egzamin koncentruje się tylko na podstawowym zestawie znaków łacińskich .
Ponadto w przypadku legalnych identyfikatorów w Javie specyfikacja znajduje się tutaj . Użyj interfejsów API klasy znaków, aby uzyskać więcej informacji.
źródło
Jednym z najbardziej, no i fajnych znaków dozwolonych w identyfikatorach Java (jednak nie na początku) jest znak Unicode o nazwie „Zero Width Non Joiner” (& zwnj ;, U + 200C, https://en.wikipedia.org / wiki / Zero-width_non-joiner ).
Miałem to raz w kodzie XML wewnątrz wartości atrybutu zawierającej odwołanie do innej części tego kodu XML. Ponieważ ZWNJ ma „zerową szerokość”, nie można go zobaczyć (z wyjątkiem, gdy idzie się razem z kursorem, jest wcześniej wyświetlany bezpośrednio na znaku). Nie można go również zobaczyć w pliku dziennika i / lub danych wyjściowych konsoli. Ale tak było przez cały czas: kopiuj i wklej w polach wyszukiwania, ale nie znalazłem wskazanej pozycji. Wpisanie (widocznej części) ciągu w polu wyszukiwania znalazło jednak określone położenie. Zajęło mi to trochę czasu, aby to rozgryźć.
Wpisanie Zero-Width-Non-Joiner jest w rzeczywistości dość łatwe (zbyt łatwe), gdy używasz europejskiego układu klawiatury, przynajmniej w jego niemieckim wariancie, np. „Europatastatur 2.02” - można go uzyskać za pomocą AltGr + „.”, Dwóch klawiszy, które niestety znajdują się bezpośrednio obok siebie na większości klawiatur i można je łatwo przypadkowo połączyć.
Powrót do Java: Pomyślałem, że możesz napisać taki kod:
z drugim i dołączonym przez łącznika o zerowej szerokości (nie mogę tego zrobić w powyższym kodzie wyciętym w edytorze stackoverflow), ale to nie działało. IntelliJ (16.3.3) nie narzekał, ale JavaC (Java 8) narzekał na już zdefiniowany identyfikator - wygląda na to, że JavaC faktycznie zezwala na znak ZWNJ jako część identyfikatora, ale przy użyciu refleksji, aby zobaczyć, co robi, ZWNJ znak zostaje usunięty z identyfikatora - coś, czym nie są znaki takie jak ‿.
źródło
Lista znaków, których możesz użyć w swoich identyfikatorach (a nie tylko na początku), jest znacznie przyjemniejsza:
Lista jest następująca:
Obejmuje większość znaków kontrolnych! Mam na myśli dzwony i gówno! Możesz ustawić swój kod źródłowy na dzwonek fn! Lub użyj znaków, które będą wyświetlane tylko czasami, takich jak miękki łącznik.
źródło