Curso JAVA
Unidad 6: "Utilidades" Objetivos de la Unidad:
1.- Introducci�n
2.- Las clases envoltorio (Wrappers)
boolean ...
Boolean
byte ...
Byte
char ... Character
short
... Short
int ... Integer
long ...
Long
float ... Float
double ...
Double
Object
+----
Number
| +----
Byte
| +----
Short
| +----
Integer
| +----
Long
| +----
Float
| +----
Double
+---- Boolean
+----
Character
3.- Clase Vector
// Inicializaci�n
x[0] = new String("Hola");
x[1] = "que
tal"; // Sin constructor expl�cito
x[2] = new StringBuffer("bien");
// Recorrido
int n = x.length;
for (int i = 0; i < n; i++)
{
System.out.println(x[i]);
}
}
}
import java.util.*;
class
EjemploVector
{
public static void
main(String args[])
{
// Declaraci�n
Vector x = new
Vector();
// Inicializaci�n
x.addElement(new String("Hola"));
x.addElement("que
tal");
x.addElement(new
StringBuffer("bien"));
// Recorrido
int n = x.size();
for (int i = 0; i < n; i++)
{
System.out.println(x.elementAt(i));
}
}
}
class
EjemploVector2
{
public static
void main(String args[])
{
//
Declaraci�n
Vector x = new
Vector();
// Inicializaci�n
x.addElement(new Integer(3));
x.addElement(new
Double(4.5));
// Recorrido
int n = x.size();
for (int i = 0; i < n; i++)
{
System.out.println(x.elementAt(i)); // println(Object) llama a
toString()
}
}
}
Con el casting (Number)x.elementAt(i) podr�amos convertir a cualquier formato num�rico (ver la documentaci�n de la clase Number)
4.- Clase Hashtable
import java.util.*;
class
EjemploHashtable
{
public static
void main(String args[])
{
// Declaraci�n
Hashtable ht = new
Hashtable();
ObjGraf obj1 = new
Rectangulo(1, 2, 3, 4); // Se pueden obtener en la Ud3
ObjGraf obj2 =
new Circulo(5, 6, 10);
ObjGraf obj3 = new
Rectangulo(11, 22, 10,
20);
//
Inicializaci�n
ht.put("rect1", obj1);
ht.put("circ1",
obj2);
ht.put("rect2",
obj3);
// Obtenci�n de un elemento de clave
conocida
ObjGraf objg = (ObjGraf)
ht.get("circ1");
// Recorrido
mediante una Enumeration, que es una implementaci�n
del
// design pattern Iterator incluido en el
JDK
Enumeration enum = ht.keys();
while (enum.hasMoreElements())
{
String clave = (String)
enum.nextElement();
ObjGraf valor =
(ObjGraf) ht.get(clave);
System.out.println(" Area de : " + clave + " = " +
valor.area());
}
}
}
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
while
(e.hasMoreElements())
{
...
... e.nextElement();
...
}
import java.util.*;
public class
EjemploEnumeration
{
/**
vectorObjetos.addElement("1111");
vectorObjetos.addElement("2222");
vectorObjetos.addElement("3333");
FusionadorArrayVector e = new
FusionadorArrayVector(arrayObjetos, vectorObjetos);
return e;
}
}
/*******************************************************/
import
java.util.*;
public class FusionadorArrayVector implements
Enumeration
{
private Object[] z;
private Vector
v;
private boolean estoyEnArray =
true;
private boolean heAcabado =
false;
int i = 0;
int j = 0;
public FusionadorArrayVector(Object[] z, Vector
v)
{
this.z =
z;
this.v = v;
}
public boolean
hasMoreElements()
{
return !heAcabado;
}
public Object
nextElement()
{
if
(estoyEnArray)
{
i++;
if (i >=
z.length)
estoyEnArray =
false;
return
z[i-1];
}
else
{
j++;
if (j >=
v.size())
heAcabado =
true;
return
v.elementAt(j-1);
}
}
}
8.- Clase StringTokenizer
public class
EjemploStringTokenizer
{
while(st.hasMoreTokens())
Para obtener una Hashtable
con las parejas "<campo>=<valor>":
import java.util.*;
public class Tokenizador
{
System.out.println( (String)
stira.get("TELEFON"));
}
}
public static
Hashtable getParamsHashtable(String s)
{
StringTokenizer st = new StringTokenizer(s,
"&");
Hashtable ht = new Hashtable();
while
(st.hasMoreTokens())
{
String token =
st.nextToken();
int posIgual =
token.indexOf("=");
if (posIgual >
0)
{
String lvalue = token.substring(0,
posIgual);
String rvalue = token.substring(posIgual +
1);
ht.put(lvalue,
rvalue);
}
}
return
ht;
}
}
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 Observadorx.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