Estoy leyendo para SCJP y tengo una pregunta con respecto a esta línea:
Los identificadores deben comenzar con una letra, un carácter de moneda ($) o un carácter de conexión como el guión bajo (_). ¡Los identificadores no pueden comenzar con un número!
Establece que un nombre de identificador válido puede comenzar con un carácter de conexión como el guión bajo. ¿Pensé que los subrayados eran la única opción válida? ¿Qué otros personajes de conexión hay?
java
unicode
identifier
scjp
LuckyLuke
fuente
fuente
_
es un identificador "obsoleto". Específicamente, el compilador emite la siguiente advertencia: (el uso de '_' como identificador podría no ser compatible en versiones posteriores a Java SE 8) ._
para su uso en futuras funciones del lenguaje . Los identificadores que comienzan con un guión bajo todavía están bien, pero un solo guión bajo es un error si se usa como un nombre de parámetro lambda y una advertencia en cualquier otro lugar.. ; [ / < > :
va: stackoverflow.com/questions/26791204/… docs.oracle.com/javase/specs/jvms/se7/html/… Todo lo demás es una restricción solo de Java._, _ -> doSomething();
.Respuestas:
Aquí hay una lista de personajes de conexión. Estos son caracteres utilizados para conectar palabras.
http://www.fileformat.info/info/unicode/category/Pc/list.htm
Esto compila en Java 7.
Un ejemplo. En este caso
tp
es el nombre de una columna y el valor de una fila dada.El seguimiento
huellas dactilares
$ _ ¢ £ ¤ ¥ ؋ ৲ ৳ ৻ ૱ ௹ ฿ ៛ ‿ ⁀ ⁔ ₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫ € ₭ ₮ ₯ ₰ ₱ ₲ ₳ ₴ ₵ ₶ ₷ ₸ ₹ ꠸ ﷼ ︳ ︴ ﹍ ﹎ ﹏ ﹩ $ _ ¢ £ ¥ ₩
fuente
int ৲, ¤, ₪₪₪₪;
: Dif( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀)
oif ($ == $)
oif (¢ + ¢== ₡)
o?if (B + ︳!= ฿)
iterar a través de los caracteres completos de 65k y preguntar
Character.isJavaIdentifierStart(c)
. La respuesta es: "undertie" decimal 8255fuente
(1 to 65535).map(_.toChar).filter(Character.isJavaIdentifierStart).size
- produce 48529 caracteres ...Character.MAX_CODE_POINT
, que probablemente sea más que2<<16
.La especificación definitiva de un identificador legal de Java se puede encontrar en la Especificación del lenguaje Java .
fuente
L
[todos],Nl
,Sc
,Pc
.Aquí hay una lista de caracteres de conector en Unicode. No los encontrará en su teclado.
U + 005F LÍNEA BAJA _
U + 203F SUBTENSIÓN ‿
U + 2040 CORBATA DE CARÁCTER ⁀
U + 2054 INVERTIDA SUBTENSIÓN ⁔
U + FE33 FORMULARIO DE PRESENTACIÓN PARA LÍNEA BAJA VERTICAL ︳
U + FE34 FORMULARIO DE PRESENTACIÓN PARA LÍNEA BAJA ONDA VERTICAL ︴
U + FE4D LÍNEA BAJA DASHED ﹍
U + FE4E LÍNEA BAJA CENTRELINA ﹎
U + FE4F LÍNEA BAJA ONDULADA ﹏
U + FF3F LÍNEA BAJA DE ANCHO COMPLETO _
fuente
Se utiliza un carácter de conexión para conectar dos caracteres.
En Java, un carácter de conexión es aquel para el que Character.getType (int codePoint) / Character.getType (char ch) devuelve un valor igual a Character.CONNECTOR_PUNCTUATION .
Tenga en cuenta que en Java, la información de los caracteres se basa en el estándar Unicode que identifica los caracteres de conexión al asignarles la categoría general Pc, que es un alias para Connector_Punctuation .
El siguiente fragmento de código,
imprime los caracteres de conexión que se pueden usar para iniciar un identificador en jdk1.6.0_45
Las siguientes compilaciones en jdk1.6.0_45,
Aparentemente, la declaración anterior no se compila en jdk1.7.0_80 y jdk1.8.0_51 para los siguientes dos caracteres de conexión (compatibilidad con versiones anteriores ... ¡Uy!),
De todos modos, aparte de los detalles, el examen se enfoca solo en el conjunto de caracteres latinos básicos .
Además, para los identificadores legales en Java, la especificación se proporciona aquí . Use las API de la clase Character para obtener más detalles.
fuente
Uno de los personajes más divertidos que se permite en los identificadores de Java (aunque no al principio) es el carácter unicode llamado "Zero Width Non Joiner" (& zwnj ;, U + 200C, https://en.wikipedia.org / wiki / Zero-width_non-joiner ).
Una vez tuve esto en un fragmento de XML dentro de un valor de atributo que contiene una referencia a otro fragmento de ese XML. Como el ZWNJ es de "ancho cero", no se puede ver (excepto cuando se camina junto con el cursor, se muestra directamente en el carácter anterior). Tampoco se pudo ver en el archivo de registro y / o la salida de la consola. Pero estuvo allí todo el tiempo: copiar y pegar en los campos de búsqueda lo obtuvo y, por lo tanto, no encontró la posición referida. Sin embargo, al escribir la (parte visible de la) cadena en el campo de búsqueda se encontró la posición referida. Me llevó un tiempo resolver esto.
Escribir un Zero-Width-Non-Joiner es realmente bastante fácil (demasiado fácil) cuando se utiliza la distribución del teclado europeo, al menos en su variante alemana, por ejemplo, "Europatastatur 2.02": se puede acceder con AltGr + ".", Dos teclas que desafortunadamente, se encuentran directamente uno al lado del otro en la mayoría de los teclados y pueden golpearse fácilmente juntos accidentalmente.
De vuelta a Java: pensé bien, podrías escribir un código como este:
con el segundo lo agregué con un ancho cero sin unión (no puedo hacer eso en el código anterior recortado en el editor de stackoverflow), pero eso no funcionó. IntelliJ (16.3.3) no se quejó, pero JavaC (Java 8) sí se quejó de un identificador ya definido: parece que JavaC realmente permite que el personaje ZWNJ forme parte de un identificador, pero cuando usa la reflexión para ver qué hace, el ZWNJ el carácter se elimina del identificador, algo que los caracteres como ‿ no son.
fuente
La lista de caracteres que puede usar dentro de sus identificadores (en lugar de solo al principio) es mucho más divertida:
La lista es:
¡Incluye la mayoría de los personajes de control! Me refiero a campanas y mierda! ¡Puede hacer que su código fuente toque el timbre fn! O utilice caracteres que solo se mostrarán a veces, como el guión suave.
fuente