Echando un vistazo a las palabras claves (keywords) del lenguaje Java (hasta la versión 7), existen varias que me llamaron poderosamente la atención:
[Keywords de Java]
- const
- goto
- native
- strictfp
- volatile
- transient
Las keywords const y goto no son soportadas en la JVM, pero siguen siendo reservadas. Por lo tanto, no pueden utilizarse como identificadores legales. Para la demás, explicaremos con varios ejemplos:
- Native: se usa utiliza para invocar métodos que ejecuten código nativo en C, C++ o ensamblador. Por consiguiente, es común usarlo en aplicaciones JNI.
- Volatile: es una de las más complicadas de entender. Resulta que al tener una aplicación multi-hilo (thread) puede surgir un problema de "visibilidad", para cada thread, en cuanto al valor de una variable "compartida". Me refiero a compartida ya que puede darse el escenario de que varios threads accedan simultáneamente a un método que utilice una misma variable global. Lo curioso es que, por defecto, el valor de esa variable sería "local" por thread, es decir, para que un thread "observe" cambios en el valor de la variable, unicámente sucederá si y sólo si dicho cambio fue realizado por el mismo. En consecuencia, si un segundo thread modifica el valor de la variable, nuestro querido thread inicial seguirá con el valor anterior (¡a pesar de que es global!).
Esta restricción, en otros motivos, a factores de rendimiento en la JVM. Hoy en día sigue siendo tema de debate en muchos foros de Java ya que genera mucha confusión en la comunidad de desarrolladores. Para meter más misterio e incertidumbre, el siguiente ejemplo demuestra una utilidad al declarar una variable como volatile. En este caso, sino se le declara como tal, entraría en un bucle indefinido el primer thread. Lo curioso es que esto fue probado en Java 6 y se da fe que sucede como se está planteando, pero en Java 7 da igual si se declara como volatile o no. Es un enigma porqué el JVM se comporta así en esa versión de Java.
- Transient: Permite que una variable no sea serializada. El concepto de serialización es unos de los más importantes en Java ya que permite que convertir una instancia en un stream de bits, persistiendo el estado de la instancia. Por lo tanto, tiene mucha utilidad para la programación Networking, sirve para almacenar datos, algunos frameworks emplean componentes Java caracterizadas por ser serializadas (ej: entidades JPA), etc.
En este contexto, una clase Java es serializada si implementa la interfaz Serializable. Lo curioso es que todas las variables de instancia, por defecto, quedan serializadas. Sin embargo, la variable que tenga la keyword transient no podrá ser persistida. El siguiente ejemplo aclara este concepto.
- Strictfp: fue incluida en la especificación 1.2 de Java y se orienta a mejorar la precisión de los cálculos de punto flotante en cualquier plataforma que se ejecute el código. Lo anterior se debe a que al usar strictfp, se garantiza que los cálculos de punto flotante se hagan dentro del marco del estándar IEEE 754. De lo contrario, los resultados de los cálculos de punto flotante pueden variar al probarse en diferentes plataformas (puede ser crítico en aplicaciones científicas que requieran máxima precisión) . En este sentido, se garantiza portabilidad.
La keyword se puede usar en un clase, interfaz o método. Si se declara en una clase, aplicará a todos los cálculos de punto flotante que se originen en cualquier método de la clase. En el caso de un método, aplicará sólo en la ejecución del método.
Este enlace es interesante al explicar sobre este tema: http://stackoverflow.com/questions/517915/when-should-i-use-the-strictfp-keyword-in-java
No hay comentarios:
Publicar un comentario