Je lis pour SCJP et j'ai une question concernant cette ligne:
Les identificateurs doivent commencer par une lettre, un caractère monétaire ($) ou un caractère de connexion tel que le trait de soulignement (_). Les identifiants ne peuvent pas commencer par un chiffre!
Il indique qu'un nom d'identifiant valide peut commencer par un caractère de connexion tel que le trait de soulignement. Je pensais que les soulignés étaient la seule option valable? Quels sont les autres personnages connectés ?
java
unicode
identifier
scjp
Lucky Luke
la source
la source
_
est un identifiant "obsolète". Plus précisément, le compilateur émet l'avertissement suivant: (l'utilisation de '_' comme identifiant peut ne pas être prise en charge dans les versions après Java SE 8) ._
pour être utilisés dans les futures fonctionnalités linguistiques . Les identificateurs qui commencent par un trait de soulignement sont toujours corrects, mais un seul trait de soulignement est une erreur s'il est utilisé comme nom de paramètre lambda et un avertissement partout ailleurs.. ; [ / < > :
va: stackoverflow.com/questions/26791204/… docs.oracle.com/javase/specs/jvms/se7/html/… Tout le reste est une restriction Java uniquement._, _ -> doSomething();
.Réponses:
Voici une liste de personnages qui se connectent. Ce sont des caractères utilisés pour connecter des mots.
http://www.fileformat.info/info/unicode/category/Pc/list.htm
Cela se compile sur Java 7.
Un exemple. Dans ce cas,
tp
c'est le nom d'une colonne et la valeur d'une ligne donnée.Le suivant
impressions
$ _ ¢ £ ¤ ¥ ؋ ৲ ৳ ৻ ૱ ௹ ฿ ៛ ‿ ⁀ ⁔ ₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫ € ₭ ₮ ₯ ₰ ₹ ₲ ₳ ₴ ₵ ₶ ₷ ₸ ₹ ꠸ ﷼ ︳ ︴ ﹍ ﹎ ﹏ ﹏ ﹩ $ _ ¢ £ ¥ ₩
la source
int ৲, ¤, ₪₪₪₪;
: Dif( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀)
ouif ($ == $)
ouif (¢ + ¢== ₡)
ouif (B + ︳!= ฿)
parcourir tous les caractères 65k et demander
Character.isJavaIdentifierStart(c)
. La réponse est: "Undertie" décimal 8255la source
(1 to 65535).map(_.toChar).filter(Character.isJavaIdentifierStart).size
- donne 48529 caractères ...Character.MAX_CODE_POINT
, ce qui est probablement plus que2<<16
.La spécification définitive d'un identifiant Java légal peut être trouvée dans la spécification du langage Java .
la source
L
[tous],Nl
,Sc
,Pc
.Voici une liste de caractères de connecteur en Unicode. Vous ne les trouverez pas sur votre clavier.
U + 005F LIGNE INFÉRIEURE _
U + 203F SOUS-TÊTE ‿
U + 2040 CRAVATE DE CARACTÈRE ⁀
U + 2054 SOUS-TÊTE INVERSÉE ⁔
U + FE33 FORMULAIRE DE
PRÉSENTATION POUR LA LIGNE LÉGÈRE VERTICALE ︳ U + FE34 FORMULAIRE DE PRÉSENTATION POUR LA LIGNE LÉGÈRE INFÉRIEURE VERTICALE ︴
U + FE4D LIGNE BASSE ÉCRASÉE ﹍
U + FE4E CENTRELINE LOW LINE ﹎
U + FE4F WAVY LOW LINE ﹏
U + FF3F PLEINE LARGEUR LOW LOW _
la source
Un caractère de connexion est utilisé pour connecter deux caractères.
En Java, un caractère de connexion est celui pour lequel Character.getType (int codePoint) / Character.getType (char ch) renvoie une valeur égale à Character.CONNECTOR_PUNCTUATION .
Notez qu'en Java, les informations sur les caractères sont basées sur la norme Unicode qui identifie les caractères de connexion en leur affectant la catégorie générale Pc, qui est un alias pour Connector_Punctuation .
L'extrait de code suivant,
imprime les caractères de connexion qui peuvent être utilisés pour démarrer un identificateur sur jdk1.6.0_45
Ce qui suit se compile sur jdk1.6.0_45,
Apparemment, la déclaration ci-dessus ne parvient pas à se compiler sur jdk1.7.0_80 et jdk1.8.0_51 pour les deux caractères de connexion suivants (compatibilité descendante ... oups !!!),
Quoi qu'il en soit, les détails mis à part, l'examen se concentre uniquement sur le jeu de caractères latin de base .
De plus, pour les identifiants légaux en Java, la spécification est fournie ici . Utilisez les API de classe de caractères pour obtenir plus de détails.
la source
L'un des caractères les plus amusants autorisés dans les identificateurs Java (mais pas au début) est le caractère unicode nommé "Zero Width Non Joiner" (& zwnj ;, U + 200C, https://en.wikipedia.org / wiki / Zero-width_non-joiner ).
J'ai eu ceci une fois dans un morceau de XML à l'intérieur d'une valeur d'attribut contenant une référence à un autre morceau de ce XML. Étant donné que le ZWNJ est de «largeur nulle», il ne peut pas être vu (sauf en marchant avec le curseur, il est affiché directement sur le caractère précédent). Il ne pouvait pas non plus être vu dans le fichier journal et / ou la sortie de la console. Mais il était là tout le temps: le copier-coller dans les champs de recherche l'a obtenu et n'a donc pas trouvé la position référencée. La saisie de la partie (visible de la) chaîne dans le champ de recherche a cependant trouvé la position référencée. Cela m'a pris un certain temps pour comprendre cela.
Taper un Zero-Width-Non-Joiner est en fait assez facile (trop facile) lorsque vous utilisez la disposition du clavier européen, au moins dans sa variante allemande, par exemple "Europatastatur 2.02" - il est accessible avec AltGr + ".", Deux touches qui Malheureusement, ils sont situés directement les uns à côté des autres sur la plupart des claviers et peuvent facilement être joints accidentellement.
Retour à Java: j'ai bien pensé, vous pouvez écrire du code comme celui-ci:
avec le second i ajouté par un non-joiner de largeur nulle (ne peut pas faire cela dans le code ci-dessus coupé dans l'éditeur de stackoverflow), mais cela n'a pas fonctionné. IntelliJ (16.3.3) ne s'est pas plaint, mais JavaC (Java 8) s'est plaint d'un identificateur déjà défini - il semble que JavaC autorise en fait le caractère ZWNJ dans le cadre d'un identificateur, mais lors de l'utilisation de la réflexion pour voir ce qu'il fait, le ZWNJ le caractère est supprimé de l'identifiant - ce que les caractères comme ‿ ne sont pas.
la source
La liste des caractères que vous pouvez utiliser dans vos identifiants (plutôt que juste au début) est beaucoup plus amusante:
La liste est:
Il comprend la plupart des personnages de contrôle! Je veux dire des cloches et de la merde! Vous pouvez faire sonner votre code source la cloche fn! Ou utilisez des caractères qui ne s'affichent que parfois, comme le trait d'union doux.
la source