La compilación 3 de las compilaciones de acceso anticipado de JDK 17 incluye la implementación de JDK-8251989 (“utilidad de formato y análisis hexadecimal”). Esta funcionalidad recién introducida para analizar y formatear valores hexadecimales está encapsulada en la nueva clase y es el tema de esta publicación.
Ejecutar javap contra la nueva clase proporciona una manera fácil de ver una descripción general de su API. La siguiente salida se genera a partir de la ejecución :
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | Compiled from "HexFormat.java" public final class java.util.HexFormat { static final boolean $assertionsDisabled; public static java.util.HexFormat of(); public static java.util.HexFormat ofDelimiter(java.lang.String); public java.util.HexFormat withDelimiter(java.lang.String); public java.util.HexFormat withPrefix(java.lang.String); public java.util.HexFormat withSuffix(java.lang.String); public java.util.HexFormat withUpperCase(); public java.util.HexFormat withLowerCase(); public java.lang.String delimiter(); public java.lang.String prefix(); public java.lang.String suffix(); public boolean isUpperCase(); public java.lang.String formatHex( byte []); public java.lang.String formatHex( byte [], int , int ); public <A extends java.lang.Appendable> A formatHex(A, byte []); public <A extends java.lang.Appendable> A formatHex(A, byte [], int , int ); public byte [] parseHex(java.lang.CharSequence); public byte [] parseHex(java.lang.CharSequence, int , int ); public byte [] parseHex( char [], int , int ); public char toLowHexDigit( int ); public char toHighHexDigit( int ); public <A extends java.lang.Appendable> A toHexDigits(A, byte ); public java.lang.String toHexDigits( byte ); public java.lang.String toHexDigits( char ); public java.lang.String toHexDigits( short ); public java.lang.String toHexDigits( int ); public java.lang.String toHexDigits( long ); public java.lang.String toHexDigits( long , int ); public boolean isHexDigit( int ); public int fromHexDigit( int ); public int fromHexDigits(java.lang.CharSequence); public int fromHexDigits(java.lang.CharSequence, int , int ); public long fromHexDigitsToLong(java.lang.CharSequence); public long fromHexDigitsToLong(java.lang.CharSequence, int , int ); public boolean equals(java.lang.Object); public int hashCode(); public java.lang.String toString(); static {}; } |
La lista generada por javap que se muestra arriba indica que hay dos métodos de fábrica para obtener una instancia de : y . Ambos métodos de fábrica especifican instancias de con "parámetros preestablecidos". El resto de los métodos son métodos de instancia que se utilizan generalmente para una de las cinco categorías de acción:
- Indique a la instancia que aplique parámetros diferentes a los parámetros preestablecidos con los que se creó la instancia
- Indicar parámetros configurados de instancia
- Convertir ay desde representaciones hexadecimales
- Indicar características de personajes y secuencias de caracteres
- Se reemplaza métodos: , ,
El Javadoc de nivel de clase para 's resume los propósitos de la clase en una sola oración: " convierte entre bytes y caracteres y cadenas codificadas en hexadecimal que pueden incluir marcas de formato adicionales, como prefijos, sufijos y delimitadores". Esa documentación basada en Javadoc de nivel de clase también proporciona ejemplos útiles de cómo aplicar la clase para ocultar entre estos tipos y aplicar prefijos, sufijos y delimitadores. La documentación a nivel de clase explica además que la clase es "inmutable y segura para subprocesos" y es una " clase basada en valores ".
En la última versión del código fuente de la clase que vi, se anunciaba " @since 16 ", que es una prueba del trabajo que se ha invertido en esta clase en términos de implementación, revisión y comentarios incorporados (el 33 comete es otra prueba). El lanzamiento oficial de es en realidad JDK 17 , pero la documentación de la API de acceso anticipado de JDK 17 todavía muestra " @since 16 " al momento de escribir este artículo.
En esta publicación, proporciono algunos ejemplos simples de aplicación y estas listas de códigos están disponibles en GitHub . Afortunadamente, la documentación de la API basada en Javadoc a nivel de clase proporciona muy buenos ejemplos de aplicación . Me gusta cuando el Javadoc de las clases muestra ejemplos de cómo aplicar esas clases y la documentación hace un buen trabajo al cubrir muchos aspectos del uso de esa clase. Mis ejemplos cubrirán una porción más pequeña de la API de la clase y están pensados únicamente como una introducción a la disponibilidad básica de esta clase.
Adquirir una instancia de
Hay dos métodos para adquirir una instancia de y uno de ellos se demuestra aquí:
1 2 | /** Instance of {@link HexFormat} used in this demonstration. */ private static final HexFormat HEX_FORMAT_UPPER_CASE = HexFormat.of().withUpperCase(); |
El método indica a la instancia de que "use caracteres hexadecimales en mayúsculas" ("0-9", "AF").
Convertir enteros a hexadecimales
El fragmento de código que se muestra a continuación demuestra el uso de :
01 02 03 04 05 06 07 08 09 10 11 | /** * Demonstrates use of {@link HexFormat#toHexDigits(int)}. */ public void demoIntegerToHexadecimal() { for ( int integerValue = 0 ; integerValue < 17 ; integerValue++) { out.println( "Hexadecimal representation of integer " + integerValue + ": '" + HEX_FORMAT_UPPER_CASE.toHexDigits(integerValue) + "'." ); } } |
Cuando se ejecuta el fragmento de código anterior, el resultado se ve así:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 dieciséis 17 | Hexadecimal representation of integer 0 : '00000000' . Hexadecimal representation of integer 1 : '00000001' . Hexadecimal representation of integer 2 : '00000002' . Hexadecimal representation of integer 3 : '00000003' . Hexadecimal representation of integer 4 : '00000004' . Hexadecimal representation of integer 5 : '00000005' . Hexadecimal representation of integer 6 : '00000006' . Hexadecimal representation of integer 7 : '00000007' . Hexadecimal representation of integer 8 : '00000008' . Hexadecimal representation of integer 9 : '00000009' . Hexadecimal representation of integer 10 : '0000000A' . Hexadecimal representation of integer 11 : '0000000B' . Hexadecimal representation of integer 12 : '0000000C' . Hexadecimal representation of integer 13 : '0000000D' . Hexadecimal representation of integer 14 : '0000000E' . Hexadecimal representation of integer 15 : '0000000F' . Hexadecimal representation of integer 16 : '00000010' . |
Demostrando
El siguiente código demuestra :
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 dieciséis | /** * Demonstrates use of {@link HexFormat#isHexDigit(int)}. */ public void demoIsHex() { for ( char characterValue = 'a' ; characterValue < 'i' ; characterValue++) { out.println( "Is character '" + characterValue + "' a hexadecimal value? " + HEX_FORMAT_UPPER_CASE.isHexDigit(characterValue)); } for ( char characterValue = 'A' ; characterValue < 'I' ; characterValue++) { out.println( "Is character '" + characterValue + "' a hexadecimal value? " + HEX_FORMAT_UPPER_CASE.isHexDigit(characterValue)); } } |
Aquí está el resultado de ejecutar el fragmento de código anterior:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 dieciséis | Is character 'a' a hexadecimal value? true Is character 'b' a hexadecimal value? true Is character 'c' a hexadecimal value? true Is character 'd' a hexadecimal value? true Is character 'e' a hexadecimal value? true Is character 'f' a hexadecimal value? true Is character 'g' a hexadecimal value? false Is character 'h' a hexadecimal value? false Is character 'A' a hexadecimal value? true Is character 'B' a hexadecimal value? true Is character 'C' a hexadecimal value? true Is character 'D' a hexadecimal value? true Is character 'E' a hexadecimal value? true Is character 'F' a hexadecimal value? true Is character 'G' a hexadecimal value? false Is character 'H' a hexadecimal value? false |
Demostrando
La clase proporciona una versión anulada del método y esto se demuestra en el siguiente fragmento de código y el resultado correspondiente de la ejecución de ese fragmento de código.
01 02 03 04 05 06 07 08 09 10 11 12 | /** * Demonstrates string representation of instance of * {@link HexFormat}. * * The {@link HexFormat#toString()} method provides a string * that shows the instance's parameters (not class name): * "uppercase", "delimiter", "prefix", and "suffix" */ public void demoToString() { out.println( "HexFormat.toString(): " + HEX_FORMAT_UPPER_CASE); } |
1 | HexFormat.toString(): uppercase: true , delimiter: "" , prefix: "" , suffix: "" |
Otros ejemplos de
La documentación a nivel de clase basada en Javadoc contiene más ejemplos de cómo aplicar esta clase. Los ejemplos demuestran métodos de instanciación y ; demostrar métodos de utilidad , , , y ; y demostrar métodos de especialización de instancias y . Me gusta que los últimos ejemplos sean ejemplos "realistas" de cómo se pueden usar las operaciones en situaciones prácticas (como con huellas dactilares de bytes ).
Usos de JDK de
El JDK y sus pruebas ya se utilizan . Los siguientes son algunos ejemplos de esto.
0 Comentarios
Dejanos tu comentario para seguir mejorando!