Download Paquetes
Document related concepts
no text concepts found
Transcript
Paquetes Amparo López Gaona Septiembre de 2008 Amparo López Gaona () Paquetes Septiembre de 2008 1/1 Introducción La biblioteca de clases de Java es muy grande (cientos de clases). Está organizada en paquetes Un paquete es un conjunto de clases, generalmente relacionadas entre sı́ de alguna manera. Los nombres de los paquetes son palabras separadas por puntos y se almacenan en directorios que coinciden con esos nombres. java.lang Fundamental para el lenguaje. Incluye clases como Object, Thread, Exception, System y String, las envolturas, interfaces como Comparable, etc. java.util Contiene colecciones de datos y clases. java.io Para la entrada y salida a través de flujos de datos. java.applet Para crear applets. java.awt y javax.swing Para crear interfaces con el usuario. java.sql Paquete que contiene el JDBC, para conexión de programas Java con Bases de datos. ... Amparo López Gaona () Paquetes Septiembre de 2008 2/1 Problema Se desea crear un sistema de ayuda psicológica por Internet. public class AyudaPsicologica { private InOut lector; private Psicologo freud; public AyudaPsicologica() { lector = new InOut(); freud = new Psicologo(); } public void sesion() { boolean seAcabo = false; imprimeSaludo(); while(!seAcabo) { String entrada = lector.readString().trim().toLowerCase(); if(entrada.startsWith("adios")) { seAcabo = true; } else { String respuesta = freud.generaRespuesta(); System.out.println(respuesta); } } imprimeDespedida(); } Amparo López Gaona () Paquetes Septiembre de 2008 4/1 Problema private void imprimeSaludo() { System.out.println("Bienvenido al sistema de salud mental \"Fraiser Crane\" "); System.out.println(); System.out.println("Te puedo ayudar con el problema que tengas."); System.out.println("Por favor, cuentamelo."); System.out.println("Para terminar la sesi’on, teclea ’adios’.\n"); } private void imprimeDespedida() { System.out.println("Gracias por comunicarte. Espero haber sido de ayuda. Hasta pronto."); } public static void main(String [] pps) { AyudaPsicologica ayudaP = new AyudaPsicologica(); ayudaP.sesion(); } } public class Psicologo { public Psicologo() { } public String generaRespuesta() { return "Eso suena interesante. Continua ..."; } } Amparo López Gaona () Paquetes Septiembre de 2008 6/1 Solución 2 public class AyudaPsicologica { private InOut lector; private Psicologo freud; public AyudaPsicologica() { lector = new InOut(); freud = new Psicologo(); } public void sesion() { boolean seAcabo = false; imprimeSaludo(); while(!seAcabo) { String entrada = lector.readString().trim().toLowerCase(); if(entrada.startsWith("adios")) { seAcabo = true; } else { String respuesta = freud.generaRespuesta(); System.out.println(respuesta); } } imprimeDespedida(); } private void imprimeSaludo() { System.out.println("Bienvenido al sistema de salud mental \"Fraiser Crane\" "); System.out.println(); System.out.println("Te puedo ayudar con el problema que tengas."); System.out.println("Por favor, cuentamelo."); System.out.println("Para terminar la sesi\penalty \@M \hskip \z@skip \unhbox \voidb@x \bgroup \let \unh } private void imprimeDespedida() { System.out.println("Gracias por comunicarte. Espero haber sido de ayuda. Hasta pronto."); } Amparostatic López Gaona () Paquetes Septiembre de 2008 8/1 public void main(String [] pps) { ... Solución 2 import java.util.Random; public class Psicologo { private Random aleatorio; private String [] respuestas; public Psicologo() { aleatorio = new Random(); respuestas = new String[10]; llenarRespuestas(); } public String generaRespuesta() { int indice = aleatorio.nextInt(respuestas.length); // int indice = (int) Math.random() *10; return respuestas[indice]; } private void llenarRespuestas() { respuestas[0] = "Suena complicado. Podrias describir el problema con m\penalty \@M \hskip \z@skip \unhb respuestas[1] = "No habia tenido un caso igual. Por favor sigue..."; respuestas[2] = "Suena interesante. Continua ..."; respuestas[3] = "Necesito m’as informaci’on."; respuestas[4] = "Seguro se soluciona pronto,\nDime que piensas..."; respuestas[5] = "Debes esforzarte un poco m\’as para poder mejorar\n De acuerdo?"; respuestas[6] = "Lo que me cuentas es muy vago. Dame m\’as detalles ..."; respuestas[7] = "Eso no es un problema, es un reto que te har\’a crecer!"; respuestas[8] = "Continua ..."; respuestas[9] = "En estos casos ese tipo de problemas siempre aparece. \nVamos a centrarnos en una part } } Amparo López Gaona () Paquetes Septiembre de 2008 10 / 1 Solución 3 import java.io.IOException; import java.util.HashSet; public class AyudaPsicologica { private Lector lector; private Psicologo freud; public AyudaPsicologica() { lector = new Lector(); freud = new Psicologo(); } public void sesion() { boolean seAcabo = false; imprimeSaludo(); while(!seAcabo) { try { HashSet entrada = lector.obtenerEntrada(); if(entrada.contains("adios")) { seAcabo = true; } else { String respuesta = freud.generaRespuesta(entrada); System.out.println(respuesta); } } catch (IOException e) { System.err.println("exception:"+e); } } imprimeDespedida(); } private void imprimeSaludo() { // Igual que antes } private void imprimeDespedida() { // Igual que antes } public static void main(String [] pps) { AyudaPsicologica ayudaP = new AyudaPsicologica(); ayudaP.sesion(); Paquetes } Amparo López Gaona () Septiembre de 2008 12 / 1 ... Solución 3 import import import import java.util.HashMap; java.util.Set; java.util.Iterator; java.util.Random; //import java.util.* public class Psicologo { private HashMap mapaRespuestas; // MApa para las respuestas private Random aleatorio; private String [] respuestaOmision; // Arreglo con las respuestas por omision public Psicologo() { mapaRespuestas = new HashMap(); respuestaOmision = new String[10]; llenarRespuestasOmision(); llenarMapaRespuestas(); aleatorio = new Random(); } public String generaRespuesta(Set palabras) { Iterator it = palabras.iterator(); while(it.hasNext()) { String palabra = (String)it.next(); String respuesta = (String) mapaRespuestas.get(palabra); if(respuesta != null) { return respuesta; } } return tomaUnaRespuestaOmision(); } Amparo López Gaona () Paquetes Septiembre de 2008 14 / 1 ... Solución 3 private void llenarMapaRespuestas() { mapaRespuestas.put("triste", "Porque estas triste?\n "+ "No debes sentirte triste porque eso evita sear objetivo\n" + "trata de superarlo haciendo cosas que te hagan feliz."); mapaRespuestas.put("tristeza", "La tristeza es muy mala, recuerda que todo tiene su lado bueno y asi podras superar m\ mapaRespuestas.put("gorda", "Es normal sentirse gorda en esa situacion.\n" + "Recuerda que la belleza interna es lo mas importante." + "De cualquier forma no esta de mas hacer ejercicio"); } private void llenarRespuestasOmision() { respuestaOmision[0] = "Suena complicado. Podrias describir el problema con mas detalle?"; respuestaOmision[1] = "No habia tenido un caso igual. Por favor sigue..."; respuestaOmision[2] = "Suena interesante. Continua ..."; respuestaOmision[3] = "Necesito mas informacion."; respuestaOmision[4] = "Seguro se soluciona pronto,\nDime que piensas..."; respuestaOmision[5] = "Debes esforzarte un poco mas para poder mejorar\n De acuerdo?"; respuestaOmision[6] = "Lo que me cuentas es muy vago. Dame mas detalles ..."; respuestaOmision[7] = "Eso no es un problema, es un reto que te hara crecer!"; respuestaOmision[8] = "Continua, soy todo oidos"; respuestaOmision[9] = "En estos casos ese tipo de problemas siempre aparece. \nVamos a centrarnos en un } public String tomaUnaRespuestaOmision() { int indice = aleatorio.nextInt(respuestaOmision.length); return respuestaOmision[indice]; } } Amparo López Gaona () Paquetes Septiembre de 2008 16 / 1 ... Solución 3 import java.util.HashSet; import java.util.*; public class Lector { InOut io; public Lector() { io = new InOut(); } public HashSet obtenerEntrada() throws IOException { String [] aPalabras = new String[50]; int pos = 0; System.out.print("> "); String linea = io.readString().trim().toLowerCase(); StringTokenizer tok = new StringTokenizer(linea); while (tok.hasMoreTokens()) { aPalabras[pos++] = tok.nextToken(); } HashSet palabras = new HashSet(); for(int i = 0; i < aPalabras.length; i++) { palabras.add(aPalabras[i]); } return palabras; } } Amparo López Gaona () Paquetes Septiembre de 2008 18 / 1 Flujo de entrada/salida El paquete java.io tiene varias clases para permitir operaciones de entrada/salida. Estas clases se dividen en dos categorı́as: Manejo de archivos de texto. Las clases se conocen como lectoras y escritoras. Manejo de archivos binarios. Las clases se conocen como flujos (stream). En este paquete se tiene la clase IOException para indicar que algo está mal. Algunas de sus subclases son EOFException y FileNotFoundException. http://java.sun.com/docs/books/tutorial/essential/io/index.html Amparo López Gaona () Paquetes Septiembre de 2008 19 / 1 Grabación de texto Los pasos involucrados en el almacenamiento de datos en un archivo son: Abrir el archivo. Escribir los datos en el archivo. Cerrar el archivo. El patrón para hacer estos pasos con un archivo de texto es: try { FileWriter escritor = new FileWriter("nombre del archivo"); // FileWriter esc = new FileWriter("nombre del archivo", true); ... while( ... ) { ... escritor.write( texto ); ... } escritor.close(); } catch (IOException e) { .... Amparo Paquetes Septiembre de 2008 21 / 1 } López Gaona () Lectura de texto Se podrı́a esperar que la lectura fuera con FileReader, el problema es que lee un caracter a la vez, no puede leer lı́neas. Se tiene una envoltura BufferedReader que sı́ permite leer lı́neas. El patrón para hacer estos pasos con un archivo de texto es: try { BufferedReader lector = new BufferedReader( new FileReader("nombre del archi String linea = lector.readLine(); while(linea != null) { ... linea = lector.readLine(); } lector.close(); } catch (FileNotFoundException e) { .... } catch (IOException e) { .... } Amparo López Gaona () Paquetes Septiembre de 2008 23 / 1 Serialización de objetos La serialización de objetos permite escribir objetos a archivos con una sola instrucción. También permite recuperar los objetos grabados en archivos. Para que objetos de una clase puedan serializarse, es decir hacerse persistes, es necesario que la clase implemente la interfaz java.io.Serializable La interfaz Serializable tiene el siguiente código: public interface Serializable { } Para que un objeto sea serializable todas las variables de la estructura deben ser serializables. Todos los tipos primitivos son serializables, al igual que los arreglos. Amparo López Gaona () Paquetes Septiembre de 2008 24 / 1 ... Serialización de objetos import java.io.Serializable; import java.util.Date; public class Obra implements Serializable { private String autor; private String titulo; private String tema; private Date anioNac; private int anio; ... } Amparo López Gaona () Paquetes Septiembre de 2008 26 / 1 ... Serialización de objetos import java.io.*; import java.io.Serializable; public class GrabadorObj { private ObjectOutputStream escritor; private String nombreArch ; public void abrir() throws IOException { nombreArch = "datos.ser"; abrir(nombreArch); } public void abrir(String nombre) throws IOException { nombreArch = nombre; try{ escritor = new ObjectOutputStream(new FileOutputStream(nombreArch)); } catch(IOException e){ System.out.println("Error en la apertura del archivo "+nombreArch + ": "+ e); } } public void cerrar() throws IOException { if (escritor != null) { System.out.println("Cerrando el archivo "+ nombreArch); escritor.close(); } else { System.out.println("No se abrio ningun archivo."); } } public void grabar(Object obj) throws IOException { if (escritor != null) escritor.writeObject(obj); } Amparo López Gaona () Paquetes Septiembre de 2008 28 / 1 Deserialización public class LectorObj { private ObjectInputStream lector; private String nombreArch ; public void abrir() throws IOException { nombreArch = "datos.ser"; abrir(nombreArch); } public void abrir(String nombre) throws IOException { nombreArch = nombre; try{ lector = new ObjectInputStream(new FileInputStream(nombreArch)); } catch(IOException e){ System.out.println("Error en la apertura del archivo "+nombreArch + " para lectura"); } } public void cerrar() throws IOException { if (lector != null) { System.out.println("Cerrando el archivo "+ nombreArch); lector.close(); } else { System.out.println("No se abrio ningun archivo."); } } public Object leer() throws IOException, ClassNotFoundException { Object obj = null; if (lector != null) try { obj = lector.readObject(); } catch (EOFException eof) { //Fin del archivo } catch (Exception e) { System.out.println("Excepcion "+e); } return obj; Paquetes Septiembre de 2008 } Amparo López Gaona () 30 / 1 Ejemplo de uso de serialización public class ObjetosPersistentes { public static void main (String [] pps) { GrabadorObj salida; salida = new GrabadorObj(); String nombreDeArchivo; nombreDeArchivo = (pps.length != 0) ? pps[0] : "prueba.ser"; try { salida.abrir(nombreDeArchivo); salida.grabar(new Persona("Andrea", 16)); salida.grabar(new Persona("Maria", 12)); salida.grabar(new Persona("Daniela", 12)); salida.grabar(new Persona("Mariana", 4)); salida.cerrar(); } catch(Exception e) { System.out.println("Error "+ e); } LectorObj entrada = new LectorObj(); try { entrada.abrir(nombreDeArchivo); Persona obj; do { obj = (Persona) entrada.leer(); System.out.println(obj); } while (obj != null); entrada.cerrar(); } catch(Exception e) { System.out.println("Error "+ e); } } } Amparo López Gaona () Paquetes Septiembre de 2008 32 / 1 Serialización y agregación public class Punto implements java.io.Serializable{ private int x; private int y; public Punto (int nuevaX, int nuevaY) { x = nuevaX; y = nuevaY; } public String toString(){ return new String("("+x+", "+y+")"); } } public class Rectangulo implements java.io.Serializable{ private int ancho ; private int largo ; private Punto origen; public Rectangulo (Punto p, int a, int l) { origen = p; largo = l; ancho = a; } public String toString(){ String texto=origen+" ancho: "+ancho+" largo :"+largo; return texto; } } En el caso de que Punto no implemente la interfaz Serializable se lanza una excepción java.io.NotSerializableException Amparo López Gaona () Paquetes Septiembre de 2008 34 / 1 Serialización y herencia public abstract class Figura implements java.io.Serializable{ protected int x; protected int y; public Figura(int nuevaX, int nuevaY) { x = nuevaX; y = nuevaY; } public abstract double area(); } class Circulo extends Figura{ protected double radio; private static final double PI=3.1416; public Circulo(int x, int y, double radio){ super(x,y); this.radio=radio; } public double area(){ return PI*radio*radio; } } class Rectangulo extends Figura{ protected double ancho, alto; public Rectangulo(int x, int y, double ancho, double alto){ super(x,y); this.ancho=ancho; this.alto=alto; } public double area(){ return ancho*alto; } Amparo López Gaona () Paquetes Septiembre de 2008 36 / 1 ... Serialización y herencia public class ObjetosPersistentes { public static void main (String [] pps) { GrabadorObj salida; salida = new GrabadorObj(); String nombreDeArchivo; Figura fig1=new Rectangulo(10,15, 30, 60); Figura fig2=new Circulo(12,19, 60); nombreDeArchivo = (pps.length != 0) ? pps[0] : "prueba.ser"; try { salida.abrir(nombreDeArchivo); salida.grabar("Guardando objetos de una clases derivadas.\n"); salida.grabar(fig1); salida.grabar(fig2); salida.cerrar(); } catch(Exception e) { System.out.println("Error "+ e); } Amparo López Gaona () Paquetes Septiembre de 2008 38 / 1 ... Serialización y herencia public class ObjetosPersistentes { public static void main (String [] pps) { GrabadorObj salida; salida = new GrabadorObj(); String nombreDeArchivo; Figura fig1=new Rectangulo(10,15, 30, 60); Figura fig2=new Circulo(12,19, 60); nombreDeArchivo = (pps.length != 0) ? pps[0] : "prueba.ser"; try { salida.abrir(nombreDeArchivo); salida.grabar("Guardando objetos de una clases derivadas.\n"); salida.grabar(fig1); salida.grabar(fig2); salida.cerrar(); } catch(Exception e) { System.out.println("Error "+ e); } LectorObj entrada = new LectorObj(); try { entrada.abrir(nombreDeArchivo); String str=(String)entrada.leer(); Figura obj1=(Figura)entrada.leer(); Figura obj2=(Figura)entrada.leer(); System.out.println("------------------------------"); System.out.println(obj1.getClass().getName()+" origen ("+obj1.x+", "+obj1.y+")"+" area="+obj1.area()); System.out.println(obj2.getClass().getName()+" origen ("+obj2.x+", "+obj2.y+")"+" area="+obj2.area()); System.out.println("------------------------------"); entrada.cerrar(); } catch(Exception e) { System.out.println("Error "+ e); } Amparo López Gaona () Paquetes Septiembre de 2008 38 / 1 Creación de paquetes Si tenemos: // en el archivo Desplazable.java public interface Desplazable { . . . } // en el archivo Figura.java public abstract class Figura { . . . } // en el archivo Circulo.java public class Circulo extends Figura implements Desplazable { . . . } // en el archivo Rectangulo.java public class Rectangulo extends Figura implements Desplazable { . . . } // en el archivo Punto.java public class Punto extends Figura implements Desplazable { . . . } // en el archivo Linea.java public class Linea extends Figura implements Desplazable { . . . } Amparo López Gaona () Paquetes Septiembre de 2008 40 / 1 ... Creación de paquetes Resulta conveniente agruparlas en paquetes por lo siguiente: Facilita determinar cuáles tipos (clases, interfaces) están relacionados. Permite saber en donde están los tipos relacionados, por ejemplo, para las funciones gráficas. Los nombres de los tipos no entran en conflicto con los nombres de tipos en otros paquetes, porque se crea una especie de espacio de nombres. Amparo López Gaona () Paquetes Septiembre de 2008 41 / 1 ... Creación de paquetes La palabra reservada package permite agrupar clases e interfaces. Debe ser la primera lı́nea del archivo que contiene las clases, interfaces (tipos) que se desea incluir en el paquete. La estructura del archivo en Java es: Una única intrucción de paquete. Las intrucciones de importación deseadas (opcional). La declaración de una, y sólo una, clase/interfaz pública. Las clases privadas del paquete (opcional). Amparo López Gaona () Paquetes Septiembre de 2008 42 / 1 Ejemplo de creación de paquetes // en el archivo Desplazable.java package geometria; public interface Desplazable { . . . } // en el archivo Figura.java package geometria; public abstract class Figura { . . . } // en el archivo Circulo.java package geometria; public class Circulo extends Figura implements Desplazable { . . . } // en el archivo Rectangulo.java package geometria; public class Rectangulo extends Figura implements Desplazable { . . . } // en el archivo Punto.java package geometria; public class Punto extends Figura implements Desplazable { . . . } // en el archivo Linea.java package Amparo geometria; López Gaona () Paquetes Septiembre de 2008 44 / 1 Acceso a elementos del paquete El acceso a un elemento de un paquete puede ser: Por su nombre “calificado” Ej. java.util.Iterator El nombre corto Iterator si se incluyó al inicio del archivo la instrucción import java.util.* o import java.util.Iterator. Amparo López Gaona () Paquetes Septiembre de 2008 45 / 1 Acceso a elementos del paquete El acceso a un elemento de un paquete puede ser: Por su nombre “calificado” Ej. java.util.Iterator El nombre corto Iterator si se incluyó al inicio del archivo la instrucción import java.util.* o import java.util.Iterator. LA visibilidad de los elementos del paquete es: Nivel de acceso private protected public package Amparo López Gaona () clase si si si si subclase paquete todos si si si si si si Paquetes Septiembre de 2008 45 / 1 Paréntesis: UML UML (Unified Modeling Language) es un lenguaje gráfico para modelado de sistemas de software. Es una notación no es una metodologı́a. Su objetivo es facilitar la comprensión del problema, identificar y construir claramente la arquitectura de la solución. Proporciona gran cantidad de tipos de diagramas para modelar sistemas complejos. Diagramas de casos de uso. Diagramas de clases. Diagramas de objetos. Diagramas de actividad. Diagramas de interacción, etc. Amparo López Gaona () Paquetes Septiembre de 2008 46 / 1 UML y Java Clases: public class Empleado { ... } Amparo López Gaona () Paquetes Septiembre de 2008 48 / 1 UML y Java Clases: Empleado public class Empleado { ... } Amparo López Gaona () Paquetes Septiembre de 2008 48 / 1 ... UML y Java Estructura: public class Empleado { private double sueldo; private int antiguedad; private int emplID; public String nombre; protected double protegido; ... } Amparo López Gaona () Paquetes Septiembre de 2008 50 / 1 ... UML y Java Estructura: Empleado public class Empleado { private double sueldo; private int antiguedad; private int emplID; public String nombre; protected double protegido; ... −sueldo : double + nombre: String −antiguedad: int − empID: int # protegido:double } Amparo López Gaona () Paquetes Septiembre de 2008 50 / 1 ... UML y Java Comportamiento: public class Cuenta { private float saldo; private boolean ligada; public boolean deposito (float monto) { ... } public boolean retiro (float monto) { ... } } Amparo López Gaona () Paquetes Septiembre de 2008 52 / 1 ... UML y Java Comportamiento: Empleado public class Cuenta { private float saldo; private boolean ligada; − saldo : float − ligada : boolean + retiro(monto: double): boolean + deposito(monto: double):boolean public boolean deposito (float monto) { ... } public boolean retiro (float monto) { ... } } Amparo López Gaona () Paquetes Septiembre de 2008 52 / 1 ... UML y Java Interfaces: public interface InstrumentoMusical { ... } Amparo López Gaona () Paquetes Septiembre de 2008 54 / 1 ... UML y Java Interfaces: public interface InstrumentoMusical { ... } <<interface>> InstrumentoMusical InstrumentoMusical Amparo López Gaona () Paquetes Septiembre de 2008 54 / 1 ... UML y Java Paquetes: package estructuras; Amparo López Gaona () Paquetes Septiembre de 2008 56 / 1 ... UML y Java Paquetes: package estructuras; Amparo López Gaona () estructuras Paquetes Septiembre de 2008 56 / 1 Relaciones entre clases Herencia public class Empleado extends Persona { ... } Amparo López Gaona () Paquetes Septiembre de 2008 58 / 1 Relaciones entre clases Herencia Persona public class Empleado extends Persona { ... } Empleado Amparo López Gaona () Paquetes Septiembre de 2008 58 / 1 ... UML y Java Implementación de interfaces: public class InstumentoViento implements InstrumentoMusical { ... } Amparo López Gaona () Paquetes Septiembre de 2008 60 / 1 ... UML y Java Implementación de interfaces: public class InstumentoViento implements InstrumentoMusical { ... } InstrumentoViento <<interface>> InstrumentoMusical InstrumentoMusical InstrumentoViento Amparo López Gaona () Paquetes Septiembre de 2008 60 / 1 ... UML y Java Agregación public class Orden { private Elemento elementos[]; private Detalle detalles; ... } Amparo López Gaona () Paquetes Septiembre de 2008 62 / 1 ... UML y Java Agregación Rectangulo public class Orden { private Elemento elementos[]; private Detalle detalles; ... Elemento Detalle } Amparo López Gaona () Paquetes Septiembre de 2008 62 / 1