miércoles, 4 de mayo de 2011

IMPORTACIÓN ESTÁTICA DE MIEMBROS

El ejercicio 3 dice:

Cree dos paquetes: debug y debugoff, que contengan una clase idéntica con un metodo debug(). La primera versión debe mostrar su argumento String en la consola, mientras que la segunda no debe hacer nada. Utilice una linea static import para importar la clase en un programa de prueba y demuestre el efecto de la compilacion condicional.

Como vemos, el ejercicio pide que se utilicen importaciones estáticas, vamos a explicar un poco qué es esto. En Java, tenemos una clase Math, con varias constantes y métodos estáticos. Por ejemplo, tenemos la constante PI:
   public static final double PI = 3.14159265358979323846;

La palabra final significa que este valor es constante y no varía. Al ser esta constante estática, para referirnos a ella desde cualquier otra clase sin necesidad de importar la clase Math, tendríamos que escribir:
   System.out.println("Numero PI: "+Math.PI);

Como vemos hay que utilizar el nombre de la clase para referirnos a la constante. Hay una forma de evitar esto, podemos importar la variable:
   import static java.lang.Math.PI;


Fijaos no hemos importado la clase Math sino la constante PI, se trata de una importación estática. De esta forma se importan miembros (variables, constantes o métodos) estáticos, pertenecientes a una clase. No se importan clases se importan miembros. Para importar todos los miembros de Math escribiríamos:
   import static java.lang.Math.*;

Ahora en la clase en lugar de Math.PI utilizaríamos directamente PI:
   System.out.println("Numero PI: "+PI);

De esta forma el código es más claro.
Para ver más información sobre esto visita esta web:
http://download.oracle.com/javase/1,5.0/docs/guide/language/static-import.html

Ahora vamos con el ejercicio:
Creamos dos carpetas dentro de la carpeta tema6 que está dentro de paquetes, debug y debugoff, una para cada paquete. Recuerda que en el CLASSPATH hemos introducido una ruta hasta la carpeta paquetes. Dentro de la carpeta debug crearé la clase Depuracion.java y dentro de debugoff, DepuracionOff.java. Además crearé una clase Ejer_3.java que será la clase principal que importe tanto debug como debugoff. El código es el siguiente:
// Ejer_3.java
import static tema6.debug.Depuracion.*;
//import static tema6.debugoff.DepuracionOff.*;

public class Ejer_3{

   public static void main(String args[]){
      debug("Hola a todo el mundo.");
   }
}

La clase Depuracion.java es:
// Depuracion.java
package tema6.debug;

public class Depuracion{

   public static void debug(String s){
      System.out.println(s);
   }
}

La clase DepuracionOff.java es:
// DepuracionOff.java
package tema6.debugoff;

public class DepuracionOff{

   public static void debug(String s){

   }
}

Como vemos las clases Depuracion y DepuracionOff son exactamente iguales salvo que en Depuracion el método debug imprime el argumento que le pasamos, y en DepuracionOff este método no hace nada. El método debug es estático. Ahora si nos fijamos en la clase Ejer_3, vemos que tenemos dos importaciones estáticas, una de ellas está desactivada mediante comentarios, ya que es incompatible importar las dos porque la clase Ejer_3 no sabría qué método debug debe utilizar, si el de la clase Depuracion o el de DepuracionOff. Al importar estáticamente Depuracion en el código podemos utilizar el nombre del método debug directamente:
   debug("Hola a todo el mundo.");

Si no utilizásemos importación estática tendríamos que referirnos a debug de la siguiente manera:
   tema6.debug.Depuracion.debug("Hola a todo el mundo.");

Como vemos es mucho más fácil utilizar la primera forma, el código es más claro. Teniendo estos dos paquetes podemos utilizar uno para hacer pruebas (debugoff) y otro para poner el código correcto (debug). Esto sería la compilación condicional, un paquete se utiliza para la versión de depuración (debugoff) y el otro para la versión de producción (debug).

No hay comentarios:

Publicar un comentario