Curso JAVA 
 Unidad 6: "Utilidades"  
Objetivos de la Unidad:



1.- Introducci�n

2.- Las clases envoltorio (Wrappers)

3.- Clase Vector

4.- Clase Hashtable

Inciso: Noci�n de atributos est�ticos

Supongamos que queremos manejar a los objetos gr�ficos mediante un identificador que decidimos sea tipo String. Ello permitir�a bautizar a los objetos para su uso en tiempo de ejecuci�n, como cuando en un programa de flow-chart se le asigna un nombre a cada objeto. Una soluci�n ser�a que al crear un objeto autom�ticamente se insertara en una Hashtable que denominaremos ht la pareja nombre-ref. al objeto tal y como se muestra en el ejemplo anterior. La pregunta es �d�nde declarar y definir ht?. ht es un atributo de la clase Aplicacion pero resulta que no hay ninguna instancia de la clase Aplicacion. En realidad ht no es atributo de ning�n objeto concreto y por lo tanto puede existir al margen de la existencia o no de objetos de una clase. En definitiva la soluci�n es:

public class Aplicacion
{
   static Hashtable ht = new Hashtable();
   ...

El segundo punto a implementar es que el constructor adecuado inserte al objeto en ht. Como es una caracteristica que queremos para todos los ObjGraf se a�adir� el constructor ObjGraf. y nombre ser� una nueva propiedad de todos los ObjGraf por lo que habr� que a�adir por lo menos su setter:

protected ObjGraf(int xInicial, int yInicial, String nombre)
{
   setX(xInicial);
   setY(yInicial);
   setNombre(nombre);
   Aplicacion.ht.put(nombre, this);
}

Ello forzar� a a�adir nuevos constructores para Rectangulo y Circulo que admitan la propiedad nombre. Luego habr�a que modificar el constructor ObjGraf(int, int) de modo que cree un valor por defecto para la propiedad nombre como "SinNombre", se apoye en el otro constructor (el de mayor detalle) y garantize que todos los objetos ObjGraf estar�n en la Hashtable:

protected ObjGraf(int xInicial, int yInicial)
{
   this(xInicial, yInicial, "SinNombre");
}

Finalmente para redondear habr�a que garantizar que al destruirse un objeto �ste fuera eliminado autom�ticamente de la Hashtable. Para ello hay que sobreescribir el m�todo finalize. Como queremos que sea un comportamiento de todos los ObjGraf sobreescribiremos el de ObjGraf que quedar�a como:

protected void finalize() throws Throwable
{
  Aplicacion.ht.remove(nombre);
}

Las propiedades est�ticas y los m�todos est�ticos tienen en com�n la existencia per-se independientemente de un objeto espec�fico. Los m�todos est�ticos no reciben el par�metro impl�cito this. Un m�todo est�tico corresponde al concepto cl�sico de funci�n o subrutina (que tampoco recib�an ning�n par�metro impl�cito this).

5.- Culturilla:

6.- Clases Properties y Dictionary

7.- Interfaz Enumeration

8.- Clase StringTokenizer

9.- Clase Runtime

10.- Clases System, Date y Math

import java.util.*;

public class PruebaFechas
{
  public static void main(String args[]) throws Exception
  {
    Calendar calHoy = Calendar.getInstance();
    calHoy.setTime(new Date());

    // Fecha al cabo de 5 d�as
    cal = (Calendar)calHoy.clone();
    Date d = cal.getTime();
    long nuevoTime = d.getTime() + (5 * 86400000L); // 3600 * 24 * 1000
    d = new Date(nuevoTime);
    System.out.println(d.toString());

    // Dias de diferencia entre dos fechas
    cal.set(2000, 11, 28); // 0: Enero, ..., 11: Diciembre
    d = cal.getTime();

    long dif = d.getTime() - new Date().getTime();
    System.out.println("Dias entre fechas: " + dif / 86400000L); // 3600 * 24 * 1000

    // Otra forma de calcular la fecha al cabo de 5 d�as
    cal = (Calendar)calHoy.clone();
    cal.add(Calendar.DAY_OF_MONTH, 5);
    System.out.println("Dia despues de 5 dias: " + cal.getTime());

    // Y Otra forma de calcular la fecha al cabo de 5 d�as
    cal = (Calendar)calHoy.clone();
    cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH) + 5);
    System.out.println("Dia despues de 5 dias: " + cal.getTime());

    // Otra forma de calcular la fecha al cabo de 1 semana
    Calendar cal = (Calendar)calHoy.clone();
    cal.set(Calendar.WEEK_OF_MONTH, cal.get(Calendar.WEEK_OF_MONTH) + 1);
    System.out.println("Dia despues de una semana: " + cal.getTime());

  }
}

11.- Protocolo Observer/Observable (Patr�n de dise�o Observer)
 
En el JDK el patr�n de dise�o Observer aparece en varias ocasiones. La gesti�n de eventos JDK 1.1 est� basada en �l (Observable = Componente emisor y Observer = Listeners), as� como el mecanismo de actualizaci�n de datos del modelo en la separaci�n modelo/vista de Swing. Adem�s se incluyen unas clases gen�ricas para que las apliquemos en nuestros casos. Sin embargo aunque ya estaban en el JDK 1.02 no han sido utilizadas de forma gen�rica por Sun en el desarrollo del propio JDK.  

import java.util.*;
 

public class PruebaObservable
{
  public static void main(String[] args)
  {
    ElQueNotifica x = new ElQueNotifica();   // El Observado
    ElNotificado y = new ElNotificado();     // El Observador

    x.addObserver(y);

    x.indicarCambio();
    x.notifyObservers(" Desde main");
  }
}
 

class ElQueNotifica extends Observable
{
  public void indicarCambio()
  {
    setChanged();
  }
}

// El observador (en este caso ElNotificado) es el que recibe noticaciones
// cada vez que hay un cambio en el observado (en este caso ElQueNotifica)
// mediante la llamada el update(). En cierto modo update() es un evento.
class ElNotificado implements Observer
{

  public void update(Observable obj, Object arg)
  {
    System.out.println("Recibida notificaci�n. Par�metro recibido: " + arg);
  }
}
 

12.- Resumen operativo de la unidad: Una clase de utilidades


Es recomendable disponer de una clase de prop�sito general con funciones de utilidades. A continuaci�n se propone una posible clase de utilidades basada en funciones est�ticas con servicios de conversi�n de tipos entre otros.

import java.util.*;
import java.text.*;
public class Util
{
  public Util()
  {
    Locale locale = new Locale("es", "ESP");
    Locale.setDefault(locale);
  }
  // conversiones String to ...
  public static int stringToInt (String s)
  {
    int a = 0;
    try
    {
      a = Integer.parseInt(s);
    }
    catch (Exception e)
    {
      System.out.println("Capturada en Util.stringToInt()");
    }
    return a;
  }
  public static double stringToDouble (String s)
  {
    double x = 0;
    try
    {
      x = Double.valueOf(s).doubleValue();
    }
    catch (Exception e)
    {
      System.out.println("Capturada en Util.stringToDouble(). Recibida: " + s);
    }
    return x;
  }
  public static Date stringToDate (String s)
  {
    Date d = null;
    try
    {
      SimpleDateFormat sd = new SimpleDateFormat();
      sd.applyPattern("dd/MM/yy");
      d = sd.parse(s);
    }
    catch (Exception e)
    {
      System.out.println("Capturada en Util.stringToDate(). Recibida: " + s);
    }
    return d;
  }
  public static String stringToStringBD (String s)
  {
    String sBD = "";
    try
    {
      Date d = stringToDate (s);
      sBD = fechaToStringBD(d);
    }
    catch (Exception e)
    {
      System.out.println("Capturada en Util.stringToStringBD(). Recibida: " + s);
    }
    return sBD;
  }
  public static String stringBDToString (String sBD)
  {
    String s = "";
    try
    {
      Date d = stringBDToDate (sBD);
      s = fechaToString(d);
    }
    catch (Exception e)
    {
      System.out.println("Capturada en Util.stringBDToString(). Recibida: " + sBD);
    }
    return s;
  }
  public static Date stringBDToDate (String s)
  {
    Date d = null;
    try
    {
      d = (Date) java.sql.Date.valueOf(s);
    }
    catch (Exception e)
    {
      System.out.println("Capturada en Util.stringBDToDate(). Recibida: " + s);
    }
    return d;
  }
  // conversiones ... to String
  public static String fechaToString(Date d)
  {
    String s = "";
    try
    {
      SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
      s = sdf.format(d);
    }
    catch (Exception e)
    {
      System.out.println("Capturada en Util.fechaToString(). Recibida: " + d);
    }
    return s;
  }
  public static String fechaToStringBD(Date d)
  {
    String s = "";
    try
    {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      s = sdf.format(d);
    }
    catch (Exception e)
    {
      System.out.println("Capturada en Util.fechaToStringBD(). Recibida: " + d);
    }
    return s;
  }
  public static String doubleToString(double d)
  {
    String s = "";
    try
    {
      DecimalFormat df = new DecimalFormat("#,##0.00");    // .00 => 2 decimales fijos
      s = df.format(d);                                    // .## => 2 decimales m�ximo
    }
    catch (Exception e)
    {
      System.out.println("Capturada en Util.doubleToString(). Recibido: " + d);
    }
    return s;
  }
  // obtenciones de fechas en diveros formatos
  public static Date getFecha(int dia, int mes, int anyo)
  {
    Date d = null;
    try
    {
      Calendar c = Calendar.getInstance();
      c.set(anyo, mes-1, dia);
      d = c.getTime();
    }
    catch (Exception e)
    {
      System.out.println("Capturada en Util.getFecha(). Recibidos: dia = "
                          + dia + ", mes = " + mes + ", anyo = " + anyo);
    }
    return d;
  }

  public static int diasDeUnMes(int mes, int anyo)
  {
    GregorianCalendar gc = new GregorianCalendar();
    gc.set(anyo, (mes-1), 1);
    return gc.getActualMaximum(Calendar.DAY_OF_MONTH);
  }
  public static String getFechaString(int dia, int mes, int anyo)
  {
    return fechaToString(getFecha(dia, mes, anyo));
  }
  public static String getFechaString()
  {
    return fechaToString(new Date());
  }
  public static String nvl(String s)
  {
    return s == null ? "" : s.trim();
  }
}
 

13.- Fin de la parte sobre el lenguaje

En http://www.chimu.com/publications/JavaSmalltalkSyntax.html se expone una tabla comparativa entre Java i Smaltalk, lenguaje pionero en muchos aspectos del que Java ha incorporado diversos aspectos.
 


Unidad anterior - Unidad siguiente


Copyright  DENVIR STUDIOS � 

Lima - Per�, 2002

Hosted by www.Geocities.ws

1