reservadas - ¿Qué son los "caracteres de conexión" en los identificadores de Java?
que son los identificadores java (7)
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 subrayado (_). ¡Los identificadores no pueden comenzar con un número!
Indica que un nombre de identificador válido puede comenzar con un carácter de conexión , como el subrayado. Pensé que los guiones bajos eran la única opción válida? ¿Qué otros personajes de conexión hay?
Aquí hay una lista de personajes que se conectan. Estos son caracteres utilizados para conectar palabras.
http://www.fileformat.info/info/unicode/category/Pc/list.htm
U+005F _ LOW LINE
U+203F ‿ UNDERTIE
U+2040 ⁀ CHARACTER TIE
U+2054 ⁔ INVERTED UNDERTIE
U+FE33 ︳ PRESENTATION FORM FOR VERTICAL LOW LINE
U+FE34 ︴ PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
U+FE4D ﹍ DASHED LOW LINE
U+FE4E ﹎ CENTRELINE LOW LINE
U+FE4F ﹏ WAVY LOW LINE
U+FF3F _ FULLWIDTH LOW LINE
Esto se compila en Java 7.
int _, ‿, ⁀, ⁔, ︳, ︴, ﹍, ﹎, ﹏, _;
Un ejemplo. En este caso, tp
es el nombre de una columna y el valor de una fila dada.
Column<Double> ︴tp︴ = table.getColumn("tp", double.class);
double tp = row.getDouble(︴tp︴);
El seguimiento
for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
if (Character.isJavaIdentifierStart(i) && !Character.isAlphabetic(i))
System.out.print((char) i + " ");
}
huellas dactilares
$ _ ¢ £ ¤ ¥ ¥ ₠ ₠ ₠ $ _ ¢ ¥ ₩
La especificación definitiva de un identificador Java legal se puede encontrar en la Especificación del lenguaje Java .
La lista de caracteres que puede usar dentro de sus identificadores (en lugar de solo al principio) es mucho más divertida:
for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
if (Character.isJavaIdentifierPart(i) && !Character.isAlphabetic(i))
System.out.print((char) i + " ");
La lista es:
I wanted to post the output, but it''s forbidden by the SO spam filter. That''s how fun it is!
Incluye la mayoría de los personajes de control! Quiero decir campanas y mierda! Usted puede hacer que su código fuente suene la campana fn! O use caracteres que solo se mostrarán a veces, como el guión suave.
Un carácter de conexión se utiliza 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 caracteres se basa en el estándar de Unicode que identifica los caracteres de conexión asignándoles la categoría general Pc, que es un alias para la Connector_Punctuation del Connector_Punctuation .
El siguiente fragmento de código,
for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++) {
if (Character.getType(i) == Character.CONNECTOR_PUNCTUATION
&& Character.isJavaIdentifierStart(i)) {
System.out.println("character: " + String.valueOf(Character.toChars(i))
+ ", codepoint: " + i + ", hexcode: " + Integer.toHexString(i));
}
}
imprime los caracteres de conexión que se pueden usar para iniciar un identificador en jdk1.6.0_45
character: _, codepoint: 95, hexcode: 5f
character: ‿, codepoint: 8255, hexcode: 203f
character: ⁀, codepoint: 8256, hexcode: 2040
character: ⁔, codepoint: 8276, hexcode: 2054
character: ・, codepoint: 12539, hexcode: 30fb
character: ︳, codepoint: 65075, hexcode: fe33
character: ︴, codepoint: 65076, hexcode: fe34
character: ﹍, codepoint: 65101, hexcode: fe4d
character: ﹎, codepoint: 65102, hexcode: fe4e
character: ﹏, codepoint: 65103, hexcode: fe4f
character: _, codepoint: 65343, hexcode: ff3f
character: ・, codepoint: 65381, hexcode: ff65
Lo siguiente compila en jdk1.6.0_45,
int _, ‿, ⁀, ⁔, ・, ︳, ︴, ﹍, ﹎, ﹏, _, ・ = 0;
Aparentemente, la declaración anterior no se compila en jdk1.7.0_80 & jdk1.8.0_51 para los siguientes dos caracteres de conexión (compatibilidad con versiones anteriores ... oops !!!),
character: ・, codepoint: 12539, hexcode: 30fb
character: ・, codepoint: 65381, hexcode: ff65
De todos modos, aparte de los detalles, el examen se centra solo en el conjunto de caracteres básicos en latín .
Además, para los identificadores legales en Java, la especificación se proporciona here . Utilice las API de clase de caracteres para obtener más detalles.
Uno de los caracteres más divertidos que se permiten en los identificadores Java (sin embargo, 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 ).
Tuve esto una vez en una pieza de XML dentro de un valor de atributo que contiene una referencia a otra pieza de ese XML. Dado que el ZWNJ tiene un "ancho cero", no se puede ver (excepto cuando se camina con el cursor, se muestra justo en el carácter anterior). Tampoco se pudo ver en el archivo de registro y / o en la salida de la consola. Pero estuvo allí todo el tiempo: copiar y pegar en los campos de búsqueda lo consiguió 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 tomó un tiempo para resolver esto.
Escribir un Cero de Ancho sin Anticuador es en realidad bastante fácil (muy fácil) cuando se usa la distribución del teclado europeo, al menos en su variante alemana, por ejemplo, "Europatastatur 2.02" - es accesible con AltGr + ".", Dos teclas que desafortunadamente, están ubicados uno al lado del otro en la mayoría de los teclados y pueden pegarse fácilmente de forma accidental.
De vuelta a Java: pensé bien, podrías escribir un código como este:
void foo() {
int i = 1;
int i = 2;
}
con la segunda, agregada por un ancho-cero-no-ensamblador (no se puede hacer eso en el código cortado anteriormente en el editor de ), 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 el carácter ZWNJ como 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.
iterar a través de todos los caracteres de 65k y preguntar Character.isJavaIdentifierStart(c)
. La respuesta es: "undertie" decimal 8255
http://www.fileformat.info/info/unicode/category/Pc/list.htm de caracteres del conector en Unicode. No los encontrarás en tu teclado.
U + 005F LÍNEA BAJA _
U + 203F UNDERTIE ‿
U + 2040 LAZO DE PERSONAJES ⁀
U + 2054 INVERSIÓN INVERTIDA ⁔
U + FE33 FORMULARIO DE PRESENTACIÓN PARA LÍNEA BAJA VERTICAL ︳
FORMULARIO DE PRESENTACIÓN DE U + FE34 PARA LÍNEA BAJA CON ONDAS VERTICALES ︴
U + FE4D DASHED LOW LINE ﹍
U + FE4E LÍNEA BAJA CENTRELINE ﹎
U + FE4F WAVY LOW LINE ﹏
U + FF3F LÍNEA BAJA DE ANCHO COMPLETO _