tipos - variables en java
Subrayado de Java 7 en literales numéricos (8)
TL; TR;
No tiene que usarlo en ninguna parte , pero si lo desea, puede usarlo en cualquier lugar entre cada dígito .
Esto es especialmente útil para mejorar la legibilidad :
10_000_000_000 // Is equal to 10000000000
7_687_316_418_138_483.345_938 // Is equal to 7687316418138483.345938
Cuando debemos usar _ para separar dígitos en un número, no entiendo el siguiente caso en el que no puedo usarlo:
En posiciones donde se espera una secuencia de dígitos
(como se documenta en la guía JDK7 here )
¿Algunos ejemplos?
"En las posiciones donde se espera una cadena de dígitos" significa que se espera una variable de tipo Cadena que contenga dígitos, y luego usar un guión bajo hará que el subrayado sea parte del número. Por ejemplo, mira el siguiente código:
int num = 999_333;
String anum = "999_333";
System.out.println(num); //Outputs 999333
System.out.println(anum); //Outputs 999_333
Entonces, si tiene un método que espera una Cadena de dígitos como uno de los argumentos, NO use un guión bajo para separar los dígitos, ya que se tratará como cualquier otra Cadena.
Como está escrito en here :
En Java SE 7 y posteriores, cualquier número de caracteres de subrayado (_) puede aparecer en cualquier lugar entre los dígitos en un literal numérico. Esta función le permite, por ejemplo, separar grupos de dígitos en literales numéricos, lo que puede mejorar la legibilidad de su código.
Por ejemplo, si su código contiene números con muchos dígitos, puede usar un carácter de subrayado para separar los dígitos en grupos de tres, similar a cómo usaría un signo de puntuación como una coma, o un espacio, como separador.
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi = 3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;
Creo que "en las posiciones donde se espera una secuencia de dígitos" cubre cosas como secuencias de escape en literales de cadenas. Por ejemplo, no puede decir "/ u00_11".
Mi interpretación de esto es que los guiones bajos no se pueden colocar solos en posiciones donde normalmente se esperaría una cadena de dígitos:
int x1= _; // Illegal.
No tiene que usar "_", puede . Y los ejemplos dados en la propuesta son números de tarjetas de crédito, números de teléfono o simplemente números para los cuales tiene sentido tener un separador en el código.
Para el "En las posiciones donde se espera una secuencia de dígitos" es simplemente en los lugares donde se supone que debe comenzar (o finalizar) con un dígito. Aquí hay unos ejemplos.
Tenga en cuenta que de acuerdo con esta propuesta, los guiones bajos solo se pueden colocar entre los dígitos. No se pueden colocar solos en posiciones donde normalmente se esperaría una secuencia de dígitos:
int x1 = _52; // Este es un identificador, no un literal numérico.
int x2 = 5_2; // OKAY. (Decimal literal)
int x2 = 52_; // Ilegal. (Los signos de diferencia siempre deben estar entre los dígitos)
int x3 = 5_______2; // OKAY. (Decimal literal)
int x4 = 0_x52; // Ilegal. No se pueden poner guiones bajos en el prefijo de raíz "0x".
int x5 = 0x_52; // Ilegal. (Los signos de diferencia siempre deben estar entre los dígitos)
int x6 = 0x5_2; // OKAY. (Hexadecimal literal)
int x6 = 0x52_; // Ilegal. (Los signos de diferencia siempre deben estar entre los dígitos)
int x6 = 0x_; // Ilegal. (No válido con el guión bajo eliminado)
int x7 = 0_52; // OKAY. (Octal literal)
int x7 = 05_2; // OKAY. (Octal literal)
int x8 = 052_; // Ilegal. (Los signos de diferencia siempre deben estar entre los dígitos)
Recursos:
Parece que alguien eliminó la URL en la publicación original (OP). Aquí está toda la URL desagradable en caso de que alguna característica de formato lo mate de nuevo:
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
La cita específica de esa página a la que está hablando es la siguiente:
Puede colocar guiones bajos solo entre los dígitos; no puede colocar guiones bajos en los siguientes lugares:
Al comienzo o al final de un número
Adyacente a un punto decimal en un literal de punto flotante
Antes de un sufijo F o L
En posiciones donde se espera una secuencia de dígitos
Por cierto, en un esfuerzo por ser lo más perspicaz posible, se debe mencionar que para el tercer punto, tampoco se puede usar un guión bajo antes del sufijo D, como se muestra en el siguiente ejemplo:
double trouble = 123.456_D; //fail
float myBoat = 321.123_F; //fail
long winded = 90210_L; //fail
Yo también encontré el tercer punto bastante curioso. Quiero decir, en su mayor parte, todos los escenarios están cubiertos por los primeros tres puntos, entonces, ¿qué es esta misteriosa "secuencia de dígitos" por la que hablan? ¿Qué escenario realmente no se soluciona con los primeros tres puntos que los obliga a agregar este cuarto misterioso?
Inicialmente pensé que estaban hablando de notación hexadecimal o notación binaria, donde se espera un número después de la b o la x, como con los siguientes ejemplos que no funcionan:
byte size = 0_b111101; //fail
byte me = 0b_111101; //fail
int hexed = 0_x_BABE; //fail
Aún así, creo que técnicamente podría ser lo mismo que el primer punto, que dice que un guión bajo no puede estar al principio del número; pero ciertamente, se espera una ''cadena de números'' después de una ''b'' o una ''x'' cuando se usa binario o hexadecimal, ¿verdad? Entonces, si fuera un apostador, podría poner algo de dinero detrás del escenario binario / hexadecimal. Pero tengo otro escenario plausible en el que podría cubrir mi apuesta. Aquí va.
Personalmente, me gustaría que hubiera una regla en Java que dijera que solo puedes usar la palabra ''cadena'' cuando hablas de una java.lang.String. Permitir que el término ''cuerda'' retenga su significado peatonal causa confusión, y este es un ejemplo perfecto.
Ahora, si el cuarto punto dice "En posiciones donde se espera una java.lang.String of digits", podría llegar a la conclusión de que están hablando de objetos java.lang.String reales que representan números que deben analizarse. Entonces, toma este pedazo de código:
int i = Integer.parseInt("123_456");
¿Compilará eso? ¿Correrá eso? Se compilará bien, pero, por supuesto, el método parseInt espera una java.lang.String de números, y la validación o el análisis de ese java.lang.String numérico desencadenará el siguiente error en el tiempo de ejecución:
Excepción en el hilo "main" java.lang.NumberFormatException: Para la cadena de entrada: "123_456" en java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) en java.lang.Integer.parseInt (Integer.java:492) en java.lang.Integer.parseInt (Integer.java:527) en Tester.main (Tester.java:7)
Por supuesto, este es un error de tiempo de ejecución, y parece que la documentación de Oracle realmente habla de errores que serán marcados en tiempo de compilación. Pero este ciertamente es un escenario donde se espera una ''Cadena de números''.
Ahora si solo la documentación de Oracle estaba en formato Wiki. Podría tentarme a entrar y agregar algo como lo siguiente:
Puede colocar guiones bajos solo entre los dígitos; no puede colocar guiones bajos en los siguientes lugares:
Al comienzo o al final de un número
Adyacente a un punto decimal en un literal de punto flotante
Antes de un sufijo ''F'' o ''L'' o ''D'' (agregué la ''D'')
Antes o después de los marcadores hexadecimales y binarios ''x'' y ''b''
Y si proporciona un java.lang.String a un método que no espera nada más que números, se espera que el algoritmo de análisis utilizado detrás del escenario genere una excepción en tiempo de ejecución.
Por cierto, acabo de escribir un pequeño artículo sobre el tema en TheServerSide. Siéntete libre de echar un vistazo. El artículo está diseñado para alcanzar el objetivo de certificación Oracle Certified Professional, Programador Java 7, pero es un artículo bastante completo y fácil de leer para explicar las reglas sobre el uso de guiones bajos.
Certificación OCPJP: lo que necesita saber sobre literales numéricos con guiones bajos
Espero que ayude.
ninguna idea, pero aquí está la gramática, disfruta. (No veo "cadena de dígitos" en ninguna parte)
http://download.oracle.com/otndocs/jcp/enhancements-0.875-pr-oth-JSpec/
IntegerLiteral:
DecimalIntegerLiteral
HexIntegerLiteral
OctalIntegerLiteral
BinaryIntegerLiteral
BinaryIntegerLiteral:
BinaryNumeral IntegerTypeSuffixopt
BinaryNumeral:
0 b BinaryDigits
0 B BinaryDigits
DecimalNumeral:
0
NonZeroDigit Digitsopt
NonZeroDigit Underscores Digits
Underscores:
_
Underscores _
Digits:
Digit
Digit DigitsAndUnderscoresopt Digit
DigitsAndUnderscores:
DigitOrUnderscore
DigitsAndUnderscores DigitOrUnderscore
DigitOrUnderscore:
Digit
_
HexDigits:
HexDigit
HexDigit HexDigitsAndUnderscoresopt HexDigit
HexDigitsAndUnderscores:
HexDigitOrUnderscore
HexDigitsAndUnderscores HexDigitOrUnderscore
HexDigitOrUnderscore:
HexDigit
_
OctalNumeral:
0 OctalDigits
0 Underscores OctalDigits
OctalDigits:
OctalDigit
OctalDigit OctalDigitsAndUnderscoresopt OctalDigit
OctalDigitsAndUnderscores:
OctalDigitOrUnderscore
OctalDigitsAndUnderscores OctalDigitOrUnderscore
OctalDigitOrUnderscore:
OctalDigit
_
BinaryDigits:
BinaryDigit
BinaryDigit BinaryDigitsAndUnderscoresopt BinaryDigit
BinaryDigitsAndUnderscores:
BinaryDigitOrUnderscore
BinaryDigitsAndUnderscores BinaryDigitOrUnderscore
BinaryDigitOrUnderscore:
BinaryDigit
_
BinaryDigit: one of
0 1