86
Introducción a Java y Eclipse Índice 1 Introducción al lenguaje Java....................................................................................... 3 1.1 Java.......................................................................................................................... 3 1.2 Conceptos previos de POO...................................................................................... 3 1.3 Componentes de un programa Java......................................................................... 5 1.4 Herencia e interfaces.............................................................................................. 14 1.5 Clases útiles........................................................................................................... 16 1.6 Estructuras de datos............................................................................................... 22 2 Ejercicios de Introducción al lenguaje Java............................................................... 25 2.1 Uso de interfaces (1 punto).................................................................................... 25 2.2 Refactorización (1 punto)...................................................................................... 26 2.3 Documentación (0.5 puntos).................................................................................. 26 2.4 Centro cultural (1 punto)........................................................................................ 26 3 Colecciones de datos.................................................................................................. 28 3.1 Colecciones............................................................................................................ 28 3.2 Comparación de objetos......................................................................................... 38 3.3 Polimorfismo e interfaces...................................................................................... 41 3.4 Tipos de datos básicos en las colecciones..............................................................42 4 Ejercicios de colecciones............................................................................................ 43 4.1 Implementaciones e interfaces (1 punto)............................................................... 43 4.2 Uso de listas (1.5 puntos)....................................................................................... 43 5 Tratamiento de errores................................................................................................ 45 5.1 Introducción........................................................................................................... 45 5.2 Errores en tiempo de ejecución: Excepciones....................................................... 45 5.3 Errores en tiempo de compilación......................................................................... 50 6 Ejercicios de tratamiento de errores........................................................................... 56 6.1 Captura de excepciones (0.5 puntos)..................................................................... 56 Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.

Whole Site

Embed Size (px)

Citation preview

Introduccin a Java y Eclipsendice1 Introduccin al lenguaje Java....................................................................................... 31.1 Java.......................................................................................................................... 31.2 Conceptos previos de POO...................................................................................... 31.3 Componentes de un programa Java......................................................................... 51.4 Herencia e interfaces..............................................................................................141.5 Clases tiles........................................................................................................... 161.6 Estructuras de datos............................................................................................... 222 Ejercicios de Introduccin al lenguaje Java............................................................... 252.1 Uso de interfaces (1 punto).................................................................................... 252.2 Refactorizacin (1 punto)...................................................................................... 262.3 Documentacin (0.5 puntos).................................................................................. 262.4 Centro cultural (1 punto)........................................................................................263 Colecciones de datos.................................................................................................. 283.1 Colecciones............................................................................................................ 283.2 Comparacin de objetos.........................................................................................383.3 Polimorfismo e interfaces...................................................................................... 413.4 Tipos de datos bsicos en las colecciones..............................................................424 Ejercicios de colecciones............................................................................................434.1 Implementaciones e interfaces (1 punto)............................................................... 434.2 Uso de listas (1.5 puntos).......................................................................................435 Tratamiento de errores................................................................................................455.1 Introduccin........................................................................................................... 455.2 Errores en tiempo de ejecucin: Excepciones....................................................... 455.3 Errores en tiempo de compilacin......................................................................... 506 Ejercicios de tratamiento de errores........................................................................... 566.1 Captura de excepciones (0.5 puntos)..................................................................... 56Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.6.2 Lanzamiento de excepciones (1 punto)..................................................................566.3 Excepciones anidadas en la aplicacin filmotecas (1.5 puntos)............................ 587 Serializacin de datos................................................................................................. 597.1 Introduccin........................................................................................................... 597.2 Flujos de datos de entrada/salida........................................................................... 597.3 Entrada, salida y salida de error estndar...............................................................607.4 Acceso a ficheros................................................................................................... 617.5 Acceso a los recursos............................................................................................. 627.6 Acceso a la red....................................................................................................... 637.7 Codificacin de datos.............................................................................................637.8 Serializacin de objetos......................................................................................... 648 Ejercicios de Serializacin......................................................................................... 668.1 Leer un fichero de texto (0.5 puntos).....................................................................668.2 Lectura de una URL (0.5 puntos).......................................................................... 668.3 Gestin de productos (1 punto)..............................................................................668.4 Guardar datos de la filmoteca (1 punto)................................................................ 679 Hilos........................................................................................................................... 699.1 Creacin de hilos....................................................................................................699.2 Ciclo de vida y prioridades.................................................................................... 709.3 Sincronizacin de hilos.......................................................................................... 729.4 Bloques vigilados...................................................................................................739.5 Tipos de interbloqueos........................................................................................... 769.6 Mecanismos de alto nivel.......................................................................................7710 Ejercicios de Hilos.................................................................................................... 8310.1 Creacin de hilos (0.5 puntos)..............................................................................8310.2 Prioridades (0.5 puntos)....................................................................................... 8310.3 Productor/Consumidor (1 punto)......................................................................... 8410.4 Pool de hilos (1 punto)......................................................................................... 84Introduccin a Java y Eclipse2Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.1. Introduccin al lenguaje Java1.1. JavaJava es un lenguaje de programacin creado por Sun Microsystems, (empresa queposteriormentefuecompradapor Oracle) parapoder funcionar endistintos tipos deprocesadores.SusintaxisesmuyparecidaaladeCoC++,eincorporacomopropiasalgunas caractersticas que en otros lenguajes son extensiones: gestin de hilos, ejecucinremota, etc.El cdigo Java, una vez compilado, puede llevarse sin modificacin alguna sobrecualquier mquina, yejecutarlo. Estosedebeaqueel cdigoseejecutasobreunamquina hipottica o virtual, la Java Virtual Machine, que se encarga de interpretar elcdigo (ficheros compilados.class) y convertirlo a cdigo particular de la CPU que seest utilizando (siempre que se soporte dicha mquina virtual).1.2. Conceptos previos de POOJavaesunlenguajeorientadoaobjetos(OO), porloque, antesdeempezaraverquelementos componen los programas Java, conviene tener claros algunos conceptos de laprogramacin orientada a objetos (POO).1.2.1. Concepto de clase y objetoEl elemento fundamental a la hora de hablar de programacin orientada a objetos es elconceptodeobjetoens, as comoel conceptoabstractodeclase. Unobjetoesunconjunto de variables junto con los mtodos relacionados con stas. Contiene lainformacin (las variables) y la forma de manipular la informacin (los mtodos). Unaclase es el prototipo que define las variables y mtodos que va a emplear un determinadotipo de objeto, es la definicin abstracta de lo que luego supone un objeto en memoria.Poniendo un smil fuera del mundo de la informtica, la clase podra ser el concepto decoche, donde nos vienen a la memoria los parmetros que definen un coche (dimensiones,cilindrada, maletero, etc), y las operaciones que podemos hacer con un coche (acelerar,frenar, adelantar, estacionar). La idea abstracta de coche que tenemos es lo queequivaldraalaclase, ylarepresentacinconcretadecochesconcretos(porejemplo,Peugeot 307, Renault Megane, Volkswagen Polo...) seran los objetos de tipo coche.1.2.2. Concepto de campo, mtodo y constructorTodaclaseuobjetosecomponeinternamentedeconstructores, camposy/omtodos.Veamosqurepresentacadaunodeestosconceptos: uncampoesunelementoqueIntroduccin a Java y Eclipse3Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.contiene informacinrelativa a la clase, yunmtodoes unelementoque permitemanipular la informacin de los campos. Por otra parte, un constructor es un elementoque permite reservar memoria para almacenar los campos y mtodos de la clase, a la horade crear un objeto de la misma.1.2.3. Concepto de herencia y polimorfismoCon la herencia podemos definir una clase a partir de otra que ya exista, de forma que lanueva clase tendr todas las variables y mtodos de la clase a partir de la que se crea, mslas variables y mtodos nuevos que necesite. A la clase base a partir de la cual se crea lanueva clase se le llama superclase.Por ejemplo, podramos tener una clase genrica Animal, y heredamos de ella para formarclases ms especficas, como Pato, Elefante, o Len. Estas clases tendran todo lo de laclase padre Animal, y adems cada una podra tener sus propios elementos adicionales.Unacaractersticaderivadadelaherenciaesque, porejemplo, si tenemosunmtododibuja(Animal a), que se encarga de hacer un dibujo del animal que se le pasa comoparmetro, podremospasarleaestemtodocomoparmetrotantounAnimalcomounPato, Elefante, ocualquierotrosubtipodirectooindirectodeAnimal. Estoseconocecomo polimorfismo.1.2.4. Modificadores de accesoTantolasclasescomosuselementos(constructores, camposymtodos)puedenversemodificados por loquesesuelenllamar modificadores deacceso, queindicanhastadnde es accesible el elemento que modifican. Tenemos tres tipos de modificadores: privado: el elemento es accesible nicamente dentro de la clase en la que seencuentra. protegido: el elemento es accesible desde la clase en la que se encuentra, y ademsdesde las subclases que hereden de dicha clase. pblico: el elemento es accesible desde cualquier clase.1.2.5. Clases abstractas e interfacesMediantelasclasesabstractasylosinterfacespodemosdefinir el esqueletodeunafamilia de clases, de forma que los subtipos de la clase abstracta o la interfazimplementeneseesqueletoparadichosubtipoconcreto.Porejemplo,volviendoconelejemploanterior, podemosdefinirenlaclaseAnimal el mtododibuja()yel mtodoimprime(), y que Animal sea una clase abstracta o un interfaz.Vemos la diferencia entre clase, clase abstracta e interfaz con este supuesto: En una clase, al definir Animal tendramos que implementar el cdigo de los mtodosdibuja() e imprime(). Las subclases que hereden de Animal no tendran por quIntroduccin a Java y Eclipse4Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.implementar los mtodos, a no ser que quieran redefinirlos para adaptarlos a suspropias necesidades. En una clase abstracta podramos implementar los mtodos que nos interese, dejandosin implementar los dems (dejndolos como mtodos abstractos). Dichos mtodostendran que implementarse en las clases hijas. En un interfaz no podemos implementar ningn mtodo en la clase padre, y cadaclase hija tiene que hacer sus propias implementaciones de los mtodos. Adems, lasclases hijas podran implementar otros interfaces.1.3. Componentes de un programa JavaEn un programa Java podemos distinguir varios elementos:1.3.1. ClasesParadefinirunaclaseseutilizalapalabrareservadaclass, seguidadel nombredelaclase:class MiClase{...}Es recomendable que los nombres de las clases sean sustantivos (ya que suelenrepresentar entidades), pudiendo estar formados por varias palabras. La primera letra decada palabra estar en mayscula y el resto de letras en minscula. Por ejemplo,DatosUsuario, Cliente, GestorMensajes.Cuando se trate de una clase encargada nicamente de agrupar un conjunto de recursos ode constantes, su nombre se escribir en plural. Por ejemplo, Recursos, MensajesError.1.3.2. Campos y variablesDentro de una clase, o de un mtodo, podemos definir campos o variables,respectivamente, que pueden ser de tipos simples, o clases complejas, bien de la API deJava, bien que hayamos definido nosotros mismos, o bien que hayamos copiado de otrolugar.Al igual quelosnombresdelasclases, sueleserconvenienteutilizarsustantivosquedescriban el significado del campo, pudiendo estar formados tambin por varias palabras.En este caso, la primera palabra comenzar por minscula, y el resto por mayscula. Porejemplo, apellidos, fechaNacimiento, numIteraciones.De forma excepcional, cuando se trate de variables auxiliares de corto alcance se puedeponer como nombre las iniciales del tipo de datos correspondiente:int i;Vector v;Introduccin a Java y Eclipse5Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.MiOtraClase moc;Por otro lado, las constantes se declaran como final static, y sus nombres esescribirn totalmente en maysculas, separando las distintas palabras que los formen porcaracteres de subrayado ('_'). Por ejemplo, ANCHO_VENTANA, MSG_ERROR_FICHERO.1.3.3. MtodosLos mtodos o funciones se definen de forma similar a como se hacen en C: indicando eltipode datos que devuelven, el nombre del mtodo, yluegolos argumentos entreparntesis:void imprimir(String mensaje){... // Cdigo del mtodo}double sumar(double... numeros){//Nmero variable de argumentos//Se accede a ellos como a un vector://numeros[0], numeros[1], ...}Vector insertarVector(Object elemento, int posicion){... // Cdigo del mtodo}Al igual queloscampos, seescribenconlaprimerapalabraenminsculasyel restocomenzando por maysculas. En este caso normalmente utilizaremos verbos.NotaUna vez hayamos creado cualquier clase, campo o mtodo, podremos modificarlo pulsando conel botnderechosobrel enel exploradordeEclipseyseleccionandolaopcinRefactor>Rename... del men emergente. Al cambiar el nombre de cualquiera de estos elementos, Eclipseactualizar automticamente todas las referencias que hubiese enotros lugares del cdigo.Adems de esta opcin para renombrar, el men Refactor contiene bastantes ms opciones quenos permitirn reorganizar automticamente el cdigo de la aplicacin de diferentes formas.1.3.4. ConstructoresPodemos interpretar los constructores como mtodos que se llaman igual que la clase, yque se ejecutan con el operadornew para reservar memoria para los objetos que se creende dicha clase:MiClase(){... // Cdigo del constructor}MiClase(int valorA, Vector valorV){... // Cdigo de otro constructorIntroduccin a Java y Eclipse6Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.}No tenemos que preocuparnos de liberar la memoria del objeto al dejar de utilizarlo. Estolo hace automticamente el garbage collector. An as, podemos usar el mtodofinalize() para liberar manualmente.Si estamos utilizando una clase que hereda de otra, y dentro del constructor de la subclasequeremos llamar a un determinado constructor de la superclase, utilizaremos super. Si nosehacelallamadaasuper, pordefectolasuperclaseseconstruirconsuconstructorvaco. Si esta superclase no tuviese definido ningn constructor vaco, o bien quisiesemosutilizar otro constructor, podremos llamar a super proporcionando los parmetroscorrespondientesal constructoral quequeramosllamar. Porejemplo, si heredamosdeMiClase y desde la subclase queremos utilizar el segundo constructor de la superclase, alcomienzo del constructor haremos la siguiente llamada a super:SubMiClase(){super(0, new Vector());... // Cdigo de constructor subclase}NotaPodemos generar el constructor de una clase automticamente con Eclipse, pulsando con el botnderecho sobre el cdigo y seleccionando Source > Generate Constructor Using Fields... o Source> Generate Constructors From Superclass...1.3.5. PaquetesLas clases en Java se organizan (o pueden organizarse) en paquetes, de forma que cadapaquete contenga un conjunto de clases. Tambin puede haber subpaquetesespecializados dentro de un paquete o subpaquete, formando as una jerarqua depaquetes, quedespusseplasmaenel discoduroenunaestructuradedirectoriosysubdirectorios igual a la de paquetes y subpaquetes (cada clase ir en eldirectorio/subdirectorio correspondiente a su paquete/subpaquete).Cuando queremos indicar que una clase pertenece a un determinado paquete osubpaquete, se coloca al principio del fichero la palabra reservadapackage seguida porlos paquetes/subpaquetes, separados por '.' :package paq1.subpaq1;...class MiClase {...Si queremos desde otra clase utilizar una clase de un paquete o subpaquete determinado(diferente al de la clase en la que estamos), incluimos una sentenciaimport antes de laclase (y despus de la lneapackage que pueda tener la clase, si la tiene), indicando qupaquete o subpaquete queremos importar:Introduccin a Java y Eclipse7Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.import paq1.subpaq1.*;import paq1.subpaq1.MiClase;Laprimeraopcin(*)seutilizaparaimportartodaslasclasesdel paquete(seutilizacuando queremos utilizar muchas clases del paquete, para no ir importando una a una). Lasegunda opcin se utiliza para importar una clase en concreto.NotaEs recomendable indicar siempre las clases concretas que se estn importando y no utilizar el *.Deestaformaquedarmsclarocualessonlasclasesqueseutilizanrealmenteennuestrocdigo. Hay diferentes paquetes que contienen clases con el mismo nombre, y si se importasenusando * podramos tener un problema de ambigedad.Al importar, ya podemos utilizar el nombre de la clase importada directamente en la claseque estamos construyendo. Si no colocsemos el import podramos utilizar la clase igual,pero al referenciar su nombre tendramos que ponerlo completo, con paquetes ysubpaquetes:MiClase mc; // Si hemos hecho el 'import' antespaq1.subpaq1.MiClase mc; // Si NO hemos hecho el 'import' antesExiste un paquete en la API de Java, llamadojava.lang, que no es necesario importar.Todas las clases que contiene dicho paquete son directamente utilizables. Para el resto depaquetes(bienseandelaAPIonuestrospropios), sernecesarioimportarloscuandoestemos creando una clase fuera de dichos paquetes.Los paquetes normalmente se escribirntotalmente enminsculas. Es recomendableutilizar nombres de paquetes similares a la URL de nuestra organizacin pero a la inversa,es decir, de ms general a ms concreto. Por ejemplo, si nuestra URL eshttp://www.jtech.ua.eslospaquetesdenuestraaplicacinpodranrecibirnombrescomo es.ua.jtech.proyecto.interfaz, es.ua.jtech.proyecto.datos, etc.ImportanteNunca se debe crear una clase sinasignarle nombre de paquete. Eneste casola clase seencontrara en el paquete sin nombre, y no podra ser referenciada por las clases del resto depaquetes de la aplicacin.ConEclipsepodemosimportardeformaautomticalospaquetesnecesarios. Paraellopodemos pulsar sobre el cdigo con el botn derecho y seleccionar Source > Organizeimports. Estoaadiryordenartodoslos importsnecesarios. Sinembargo, estonofuncionar si el cdigo tiene errores de sintaxis. En ese caso si que podramos aadir unimport individual, situando el cursor sobre el nombre que se quiera importar, pulsandocon el botn derecho, y seleccionando Source > Add import.Introduccin a Java y Eclipse8Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.1.3.6. Tipo enumeradoEl tipo enum permite definir un conjunto de posibles valores o estados, que luegopodremos utilizar donde queramos:Ejemplo// Define una lista de 3 valores y luego comprueba en un switch// cul es el valor que tiene un objeto de ese tipoenum EstadoCivil {soltero, casado, divorciado};EstadoCivil ec = EstadoCivil.casado;ec = EstadoCivil.soltero;switch(ec){case soltero: System.out.println("Es soltero");break;case casado: System.out.println("Es casado");break;case divorciado:System.out.println("Es divorciado");break;}LoselementosdeunaenumeracinsecomportancomoobjetosJava. Porlotanto, laforma de nombrar las enumeraciones ser similar a la de las clases (cada palabraempezando por mayscula, y el resto de clases en minscula).Como objetos Java que son, estos elementos pueden tener definidos campos, mtodos einclusoconstructores. Imaginemos por ejemploquedecadatipodeestadocivil nosinteresase conocer la retencin que se les aplica en el sueldo. Podramos introducir estainformacin de la siguiente forma:enum EstadoCivil {soltero(0.14f), casado(0.18f), divorciado(0.14f);private float retencion;EstadoCivil(float retencion) {this.retencion = retencion;}public float getRetencion() {return retencion;}};De esta forma podramos calcular de forma sencilla la retencin que se le aplica a unapersona dado su salario y su estado civil de la siguiente forma:public float calculaRetencion(EstadoCivil ec, float salario) {return salario * ec.getRetencion();}Dado que los elementos de la enumeracin son objetos, podramos crear nuevos mtodosobiensobrescribir mtodosdelaclase Object. Por ejemplo, podramosredefinir elmtodotoStringparaespecificarlaformaenlaqueseimprimecadaelementodelaenumeracin (por defecto imprime una cadena con el nombre del elemento, por ejemplo"soltero").Introduccin a Java y Eclipse9Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.1.3.7. Modificadores de accesoTantolasclasescomoloscamposymtodosadmitenmodificadoresdeacceso, paraindicar si dichos elementos tienen mbito pblico, protegido o privado. Dichosmodificadores se marcan con las palabras reservadaspublic, protected yprivate,respectivamente, y se colocan al principio de la declaracin:public class MiClase {...protected int b;...private int miMetodo(int b) {...El modificadorprotected implica que los elementos que lo llevan son visibles desde laclase, sus subclases, y las dems clases del mismo paquete que la clase.Sinoseespecificaningnmodificador, elelementoserconsideradodetipopaquete.Estetipodeelementos podrnser visibles desdelaclaseodesdeclases del mismopaquete, pero no desde las subclases.Cada fichero Java que creemos debe tener una y slo una clase pblica (que ser la claseprincipal del fichero). Dicha clase debe llamarse igual que el fichero. Aparte, el ficheropodr tener otras clases internas, pero ya no podrn ser pblicas.Por ejemplo, si tenemos un fichero MiClase.java, podra tener esta apariencia:public class MiClase{...}class OtraClase{...}class UnaClaseMas{...}Si queremos tener acceso a estas clases internas desde otras clases, deberemos declararlascomo estticas. Por ejemplo, si queremos definir una etiqueta para incluir en los puntos2Ddefinidosenel ejemploanterior, podemosdefinirestaetiquetacomoclaseinterna(paradejarclarodeestaformaquedichaetiquetaesparautilizarseenPunto2D).Parapoder manipular esta clase interna desde fuera deberemos declararla como esttica de lasiguiente forma:public class Punto2D {...static class Etiqueta {String texto;int tam;Color color;Introduccin a Java y Eclipse10Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.}}Podremos hacer referencia a ella desde fuera de Punto2D de la siguiente forma:Punto2D.Etiqueta etiq = new Punto2D.Etiqueta();1.3.8. Otros modificadoresAdems de los modificadores de acceso vistos antes, en clases, mtodos y/o campos sepueden utilizar tambin estos modificadores: abstract: elemento base para la herencia (los objetos subtipo debern definir esteelemento). Se utiliza para definir clases abstractas, y mtodos abstractos dentro dedichas clases, para que los implementen las subclases que hereden de ella. static: elemento compartido por todos los objetos de la misma clase. Con estemodificador, no se crea una copia del elemento en cada objeto que se cree de la clase,sino que todos comparten una sola copia en memoria del elemento, que se crea sinnecesidad de crear un objeto de la clase que lo contiene. Como se ha vistoanteriormente, tambin puede ser aplicado sobre clases, con un significado diferenteen este caso. final: objeto final, no modificable (se utiliza para definir constantes) ni heredable(en caso de aplicarlo a clases). synchronized: para elementos a los que no se puede acceder al mismo tiempo desdedistintos hilos de ejecucin.Estos modificadores se colocan tras los modificadores de acceso:// Clase abstracta para heredar de ellapublic abstract class Ejemplo{// Constante esttica de valor 10public static final TAM = 10;// Mtodo abstracto a implementarpublic abstract void metodo();public synchronized void otroMetodo(){... // Aqu dentro slo puede haber un hilo a la vez}}NotaSi tenemos un mtodo esttico (static), dentro de l slo podremos utilizar elementosestticos (campos o mtodos estticos), o bien campos y mtodos de objetos que hayamos creadodentro del mtodo.Por ejemplo, si tenemos:public class UnaClase{Introduccin a Java y Eclipse11Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.public int a;public static int metodo(){return a + 1;}}Dar error, porque el campoa no es esttico, y lo estamos utilizando dentro del mtodoesttico. Para solucionarlo tenemos dos posibilidades: definir a como esttico (si el diseodel programa lo permite), o bien crear un objeto de tipo UnaClase en el mtodo, y utilizarsu campoa (que ya no har falta que sea esttico, porque hemos creado un objeto y yapodemos acceder a su campo a):public class UnaClase{public int a;public static int metodo(){UnaClase uc = new UnaClase();// ... Aqu haramos que uc.a tuviese el valor adecuadoreturn uc.a + 1;}}NotaPara hacer referencia a un elemento esttico utilizaremos siempre el nombre de la clase a la quepertenece, y no la referencia a una instancia concreta de dicha clase.Por ejemplo, si hacemos lo siguiente:UnaClase uc = new UnaClase();uc.metodo();Aparecerunwarning, debidoaqueel mtodometodonoespropiodelainstanciaconcreta uc, sino da la clase UnaClase en general. Por lo tanto, deberemos llamarlo con:UnaClase.metodo();1.3.9. Imports estticosLos imports estticos permiten importar los elementos estticos de una clase, de formaqueparareferenciarlosnotengamosqueponersiemprecomoprefijoel nombredelaclase. Por ejemplo, podemos utilizar las constantes de color de la clasejava.awt.Color,o bien los mtodos matemticos de la case Math.Ejemploimport static java.awt.Color;import static java.lang.Math;public class...{Introduccin a Java y Eclipse12Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved....JLabel lbl = new JLabel();lbl.setBackground(white); // Antes sera Color.white...double raiz = sqrt(1252.2); // Antes sera Math.sqrt(...)}1.3.10. Argumentos variablesJava permite pasar un nmero variable de argumentos a una funcin (como sucede confunciones comoprintf en C). Esto se consigue mediante la expresin "..." a partir delmomento en que queramos tener un nmero variable de argumentos.Ejemplo// Funcion que tiene un parmetro Stringobligatorio// y n parmetros int opcionalespublic void miFunc(String param, int... args){...// Una forma de procesar n parametros variablesfor (int argumento: args){...}...}...miFunc("Hola", 1, 20, 30, 2);miFunc("Adios");1.3.11. Metainformacin o anotacionesSe tiene la posibilidad de aadir ciertas anotaciones en campos, mtodos, clases y otroselementos, que permitan a las herramientas de desarrollo o de despliegue leerlas y realizarciertas tareas. Por ejemplo, generar ficheros fuentes, ficheros XML, o un Stub de mtodospara utilizar remotamente con RMI.Un ejemplo ms claro lo tenemos en las anotaciones que ya se utilizan para laherramientaJavadoc. Las marcas @deprecatednoafectanal comportamientodelosmtodos que las llevan, pero previenen al compilador para que muestre una advertenciaindicandoqueel mtodoqueseutilizaestdesaconsejado. Tambinsetienenotrasmarcas @param, @return, @see, etc, queutilizaJavadocparagenerarlaspginasdedocumentacin y las relaciones entre ellas.1.3.12. Ejecucin de clases: mtodo mainEn las clases principales de una aplicacin (las clases que queramos ejecutar) debe haberun mtodo main con la siguiente estructura:public static void main(String[] args)Introduccin a Java y Eclipse13Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.{... // Cdigo del mtodo}Dentropondremoselcdigoquequeramosejecutardesdeesaclase. Hayquetenerencuenta quemain es esttico, con lo que dentro slo podremos utilizar campos y mtodosestticos, o bien campos y mtodos de objetos que creemos dentro del main.1.4. Herencia e interfaces1.4.1. HerenciaCuando queremos que una clase herede de otra, se utiliza al declararla la palabra extendstras el nombre de la clase, para decir de qu clase se hereda. Para hacer quePatoheredede Animal:class Pato extends AnimalCon esto automticamentePato tomara todo lo que tuvieseAnimal (aparte,Pato puedeaadirsuscaractersticaspropias). Si Animalfueseunaclaseabstracta, Pato deberaimplementar los mtodos abstractos que tuviese.1.4.2. Punteros this y superEl punterothisapuntaal objetoenel quenosencontramos. Seutilizanormalmentecuando hay variables locales con el mismo nombre que variables de instancia de nuestroobjeto:public class MiClase{int i;public MiClase(int i){this.i = i; // i de la clase = parametro i}}Tambin se suele utilizar para remarcar que se est accediendo a variables de instancia.El puntero super se usa para acceder a un elemento en la clase padre. Si la clase Usuariotiene un mtodo getPermisos, y una subclase UsuarioAdministrador sobrescribe dichomtodo, podramos llamar al mtodo de la super-clase con:public class UsuarioAdministrador extends Usuario {public List getPermisos() {List permisos = super.getPermisos();permisos.add(PERMISO_ADMINISTRADOR);return permisos;}}Tambin podemos utilizar this y super como primera instruccin dentro de unIntroduccin a Java y Eclipse14Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.constructor para invocar a otros constructores. Dado que toda clase en Java hereda de otraclase, siempre ser necesario llamar a alguno de los constructores de la super-clase paraque se construya la parte relativa a ella. Por lo tanto, si al comienzo del constructor no seespecifica ninguna llamada a this o super, se considera que hay una llamada implcita alconstructorsinparmetrosdelasuper-clase(super()). Esdecir, losdosconstructoressiguientes son equivalentes:public Punto2D(int x, int y, String etiq) {// Existe una llamada implicita a super()this.x = x;this.y = y;this.etiq = etiq;}public Punto2D(int x, int y, String etiq) {super();this.x = x;this.y = y;this.etiq = etiq;}Pero es posible que la super-clase no disponga de un constructor sin parmetros. En esecaso, si no hacemos una llamada explcita asuper nos dar un error de compilacin, yaque estar intentando llamar a un constructor inexistente de forma implcita. Es posibletambin, queaunqueel constructor sinparmetros exista, nos interesellamar aotroconstructor alahoradeconstruir laparterelativaalasuper-clase. Imaginemos porejemploquelaclasePunto2DanteriorderivadeunaclasePrimitivaGeometricaquealmacena, comoinformacincomndetodaslasprimitivas, unaetiquetadetexto, yofrece un constructor que toma como parmetro dicha etiqueta. Podramos utilizar dichoconstructor desde la subclase de la siguiente forma:public Punto2D(int x, int y, String etiq) {super(etiq);this.x = x;this.y = y;}Tambin puede ocurrir que en lugar de querer llamar directamente al constructor de lasuper-clase nos interese basar nuestro constructor en otro de los constructores de nuestramisma clase. En tal caso llamaremos a this al comienzo de nuestro constructor,pasndole los parmetros correspondientes al constructor en el que queremos basarnos.Por ejemplo, podramos definir un constructor sin parmetros de nuestra clase punto, quese base en el constructor anterior (ms especfico) para crear un punto con una serie dedatos por defecto:public Punto2D() {this(DEFAULT_X, DEFAULT_Y, DEFAULT_ETIQ);}Esimportanterecalcarquelasllamadasathisosuperdebensersiemprelaprimerainstruccin del constructor.Introduccin a Java y Eclipse15Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.1.4.3. Interfaces y clases abstractasYa hemos visto cmo definir clases normales, y clases abstractas. Si queremos definir uninterfaz, se utiliza la palabra reservada interface, en lugar de class, y dentrodeclaramos (no implementamos), los mtodos que queremos que tenga la interfaz:public interface MiInterfaz{public void metodoInterfaz();public float otroMetodoInterfaz();}Despus, para que una clase implemente los mtodos de esta interfaz, se utiliza la palabrareservada implements tras el nombre de la clase:public class UnaClase implements MiInterfaz{public void metodoInterfaz(){... // Cdigo del mtodo}public float otroMetodoInterfaz(){... // Cdigo del mtodo}}Notarquesienlugardeponer implementsponemosextends, enesecasoUnaClasedebera ser un interfaz, que heredara del interfaz MiInterfaz para definir msmtodos, pero no para implementar los que tiene la interfaz. Esto se utilizara para definirinterfaces partiendo de un interfaz base, para aadir ms mtodos a implementar.Una clase puede heredar slode otra nica clase, peropuede implementar cuantosinterfaces necesite:public class UnaClase extends MiClaseimplements MiInterfaz, MiInterfaz2, MiInterfaz3{...}Cuando una clase implementa una interfaz se est asegurando que dicha clase va a ofrecerlos mtodos definidos en la interfaz, es decir, que la clase al menos nos ofrece esa interfazparaacceder aella. Cuandoheredamos deunaclaseabstracta, heredamos todos loscampos yel comportamientode la superclase, yadems deberemos definir algunosmtodos que no haban sido implementados en la superclase.Desdeel puntodevistadel diseo, podemosver laherenciacomounarelacinES,mientras que la implementacin de una interfaz sera una relacin ACTA COMO.1.5. Clases tilesIntroduccin a Java y Eclipse16Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.CuandoseprogramaconJava, sedisponedeantemanodeunconjuntodeclasesyaimplementadas. Estas clases (aparte de las que pueda hacer el usuario) forman parte delpropiolenguaje(loqueseconocecomo API(ApplicationProgrammingInterface)deJava).En esta seccin vamos a ver una serie de clases que conviene conocer ya que nos sern degran utilidad para realizar nuestros programas:1.5.1. ObjectEsta es la clase base de todas las clases en Java, toda clase hereda en ltima instancia dela clase Object, por lo que los mtodos que ofrece estarn disponibles en cualquier objetoJava, sea de la clase que sea.En Java es importante distinguir claramente entre lo que es una variable, y lo que es unobjeto. Las variables simplemente son referencias a objetos, mientras que los objetos sonlas entidades instanciadas en memoria que podrn ser manipulados mediante lasreferencias que tenemos a ellos (mediante variable que apunten a ellos) dentro de nuestroprograma. Cuando hacemos lo siguiente:new MiClase()Se est instanciando en memoria un nuevo objeto de clase MiClase y nos devuelve unareferenciaadichoobjeto. Nosotrosdeberemosguardarnosdichareferenciaenalgunavariable con el fin de poder acceder al objeto creado desde nuestro programa:MiClase mc = new MiClase();Es importante declarar la referencia del tipo adecuado (en este caso tipo MiClase) paramanipular el objeto, ya que el tipo de la referencia ser el que indicar al compilador lasoperaciones que podremos realizar con dicho objeto. El tipo de esta referencia podr sertanto el mismo tipo del objeto al que vayamos a apuntar, o bien el de cualquier clase de laque herede o interfaz que implemente nuestro objeto. Por ejemplo, si MiClase se definede la siguiente forma:public class MiClase extends Thread implements List {...}Podremos hacer referencia a ella de diferentes formas:MiClase mc = new MiClase();Thread t = new MiClase();List l = new MiClase();Object o = new MiClase();Esto es as ya que al heredar tanto deThread como deObject, sabemos que el objetotendrtodoloquetienenestas clases ms loqueaada MiClase, por loquepodrcomportarse como cualquiera de las clases anteriores. Lo mismo ocurre al implementaruna interfaz, al forzar a que se implementen sus mtodos podremos hacer referencia alIntroduccin a Java y Eclipse17Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.objetomediante la interfaz ya que sabemos que va a contener todos esos mtodos.Siempre vamos a poder hacer esta asignacin 'ascendente' a clases o interfaces de las quederiva nuestro objeto.Si hacemos referencia a un objetoMiClase mediante una referenciaObject por ejemplo,slopodremosaccederalosmtodosdeObject, aunqueel objetocontengamtodosadicionales definidos en MiClase. Si conocemos que nuestro objeto es de tipo MiClase, yqueremos poder utilizarlo como tal, podremos hacer una asignacin 'descendente'aplicando una conversin cast al tipo concreto de objeto:Object o = new MiClase();...MiClase mc = (MiClase) o;Si resultase que nuestro objeto no es de la clase a la que hacemos cast, ni hereda de ella nilaimplementa, estallamadaresultarenun ClassCastExceptionindicandoquenopodemos hacer referencia a dicho objeto mediante esa interfaz debido a que el objeto nola cumple, y por lo tanto podrn no estar disponibles los mtodos que se definen en ella.Una vez hemos visto la diferencia entre las variables (referencias) y objetos (entidades)vamosaver comoseharlaasignacinycomparacindeobjetos. Si hiciesemoslosiguiente:MiClase mc1 = new MiClase();MiClase mc2 = mc1;Puestoquehemos dichoquelas variables simplementesonreferencias aobjetos, laasignacin estar copiando una referencia, no el objeto. Es decir, tanto la variable mc1como mc2 apuntarn a un mismo objeto.Si lo que queremos es copiar un objeto, teniendo dos entidades independientes,deberemos invocar el mtodo clone del objeto a copiar:MiClase mc2 = (MiClase)mc1.clone();El mtodoclone es un mtodo de la claseObject que estar disponible para cualquierobjeto Java, y nos devuelve un Object genrico, ya que al ser un mtodo que puede servirpara cualquier objeto nos debe devolver la copia de este tipo. De l tendremos que haceruna conversin cast a la clase de la que se trate como hemos visto en el ejemplo. Al haceruna copia conclone se copiarn los valores de todas las variables de instancia, pero siestasvariablessonreferenciasaobjetosslosecopiarlareferencia, noelobjeto. Esdecir, no se har una copia en profundidad. Si queremos hacer una copia en profundidaddeberemos sobrescribir el mtodocloneparahacer unacopiadecadaunodeestosobjetos. Para copiar objetos tambin podramos definir un constructor de copia, al que sele pase como parmetro el objeto original a copiar.Por otro lado, para la comparacin, si hacemos lo siguiente:mc1 == mc2Estaremoscomparandoreferencias, porloqueestaremosviendosi lasdosreferenciasIntroduccin a Java y Eclipse18Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.apuntan a un mismo objeto, y no si los objetos a los que apuntan son iguales. Para ver silos objetos son iguales, aunque sean entidades distintas, tenemos:mc1.equals(mc2)Este mtodo tambin es propio de la claseObject, y ser el que se utilice para compararinternamente los objetos. Para que funcione correctamente, este mtododebernserredefinidoennuestras clases para indicar cuandose considera que dos objetos soniguales. Por ejemplo podemos tener una clase como la siguiente:public class Punto2D {public int x, y;...public boolean equals(Object o) {Punto2D p = (Punto2D)o;// Compara objeto this con objeto preturn (x == p.x && y == p.y);}Un ltimo mtodo interesante de la clase Object es toString. Este mtodo nos devuelveuna cadena (String) que representa dicho objeto. Por defecto nos dar un identificadordel objeto, peronosotros podemos sobrescribirlaennuestras propias clases paraquegenere la cadena que queramos. De esta manera podremos imprimir el objeto en forma decadena de texto, mostrandose los datos con el formato que nosotros les hayamos dado entoString. Porejemplo, si tenemosunaclasePunto2D, serabuenaideahacerquesuconversin a cadena muestre las coordenadas (x,y) del punto:public class Punto2D {public int x,y;...public String toString() {String s = "(" + x + "," + y + ")";return s;}}1.5.2. PropertiesEsta clase es un subtipo de Hastable, que se encarga de almacenar una serie depropiedadesasociandounvalor acadaunadeellas. Estaspropiedadeslaspodremosutilizar para registrar la configuracinde nuestra aplicacin. Adems esta clase nospermitecargaroalmacenarestainformacinenalgndispositivo, comopuedeserendisco, de forma que sea persistente.PuestoqueheredadeHashtable, podremosutilizarsusmtodos, perotambinaportamtodos propios para aadir propiedades:Object setProperty(Object clave, Object valor)Introduccin a Java y Eclipse19Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.Equivalente al mtodo put.Object getProperty(Object clave)Equivalente al mtodo get.Object getProperty(Object clave, Object default)Esta variante del mtodo resulta til cuando queremos que determinada propiedaddevuelva algn valor por defecto si todava no se le ha asignado ningn valor.Adems, como hemos dicho anteriormente, para hacer persistentes estas propiedades denuestra aplicacin, se proporcionan mtodos para almacenarlas o leerlas de algndispositivo de E/S:void load(InputStream entrada)Leelaspropiedadesdel flujodeentradaproporcionado. Esteflujopuedeporejemploreferirse a un fichero del que se leern los datos.void store(OutputStream salida, String cabecera)Almacena las informacin de las propiedades escribiendolas en el flujo de salidaespecificado. Este flujo puede por ejemplo referirse a un fichero en disco, en el que seguardar nuestro conjunto de propiedades, pudiendo especificar una cadena que se pondrcomocabeceraenel fichero, yquenospermiteaadiralgncomentariosobredichofichero.1.5.3. SystemEsta clase nos ofrece una serie de mtodos y campos tiles del sistema. Esta clase no sedebe instanciar, todos estos mtodos y campos son estticos.Podemos encontrar los objetos que encapsulan la entrada, salida y salida de errorestndar, as como mtodos para redireccionarlas, que veremos con ms detalle en el temade entrada/salida.Tambin nos permite acceder al gestor de seguridad instalado, como veremos en el temasobre seguridad.Otros mtodos tiles que encontramos son:void exit(int estado)Finaliza la ejecucin de la aplicacin, devolviendo un cdigo de estado. Normalmente elcdigo0significa que ha salidode forma normal, mientras que conotros cdigosindicaremos que se ha producido algn error.void gc()Fuerza una llamada al colector de basura para limpiar la memoria. Esta es una operacinIntroduccin a Java y Eclipse20Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.costosa. Normalmente no lo llamaremos explicitamente, sino que dejaremos que Java loinvoque cuando sea necesario.long currentTimeMillis()Nos devuelve el tiempo medido en el nmero de milisegundos transcurridos desde el 1 deEnero de 1970 a las 0:00.void arraycopy(Object fuente, int pos_fuente,Object destino, int pos_dest, int n)Copia n elementos del array fuente, desde la posicin pos_fuente, al array destino a partirde la posicin pos_dest.Properties getProperties()DevuelveunobjetoPropertiesconlaspropiedadesdel sistema. Enestaspropiedadespodremos encontrar la siguiente informacin:Clave Contenidofile.separator Separador entre directorios en la ruta de losficheros. Por ejemplo "/" en UNIX.java.class.path Classpath de Javajava.class.version Versin de las clases de Javajava.home Directorio donde est instalado Javajava.vendor Empresa desarrolladora de la implementacinde la plataforma Java instaladajava.vendor.url URL de la empresajava.version Versin de Javaline.separator Separador de fin de lneas utilizadoos.arch Arquitectura del sistema operativoos.name Nombre del sistema operativoos.version Versin del sistema operativopath.separator Separador entre los distintos elementos de unavariable de entorno tipo PATH. Por ejemplo ":"user.dir Directorio actualuser.home Directorio de inicio del usuario actualuser.name Nombre de la cuenta del usuario actual1.5.4. RuntimeIntroduccin a Java y Eclipse21Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.Toda aplicacin Java tiene una instancia de la clase Runtime que se encargar de hacer deinterfazconelentornoenelqueseestejecutando.Paraobteneresteobjetodebemosutilizar el siguiente mtodo esttico:Runtime rt = Runtime.getRuntime();Unadelasoperacionesquepodremosrealizarconesteobjeto, serejecutarcomandoscomosi nosencontrsemosenlalneadecomandosdel sistemaoperativo. Paraelloutilizaremos el siguiente mtodo:rt.exec(comando);De esta forma podremos invocar programas externos desde nuestra aplicacin Java.1.5.5. MathLa clase Math nos ser de gran utilidad cuando necesitemos realizar operacionesmatemticas. Esta clase nonecesita ser instanciada, ya que todos sus mtodos sonestticos. Entreestosmtodospodremosencontrar todaslasoperacionesmatemticasbsicas que podamos necesitar, como logaritmos, exponenciales, funcionestrigonomtricas, generacindenmerosaleatorios, conversinentregradosyradianes,etc. Adems nos ofrece las constantes de los nmeros PI y E.1.5.6. Otras clasesSi miramos dentro del paquetejava.util, podremos encontrar una serie de clases quenos podrn resultar tiles para determinadas aplicaciones.EntreellastenemoslaclaseLocalequealmacenainformacinsobreunadeterminadaregin del mundo (pas e idioma), y que podr ser utilizada para internacionalizar nuestraaplicacin de forma sencilla. Una clase relacionada con esta ltima esResourceBundle,conlaquepodemosdefinirlascadenasdetextodenuestraaplicacinenunaseriedeficheros de propiedades (uno para cada idioma). Por ejemplo, podramos tener dosficheros Textos_en.properties y Textos_es.properties con los textos en ingls y encastellano respectivamente. Si abrimos el bundle de nombreTextos, se utilizar el localede nuestro sistema para cargar los textos del fichero que corresponda. Tambinencontramos otras clases relacionadas con Locale, comopor ejemplo Currencyconinformacin monetaria adaptada a nuestra zona, clases que nos permiten formatearnmeros o fechas (NumberFormat y DateFormat respectivamente) segn lasconvenciones de nuestra zona, o bien de forma personalizada, y la claseCalendar, quenos ser til cuando trabajemos con fechas y horas, para realizar operaciones con fechas,compararlas, o acceder a sus campos por separado.1.6. Estructuras de datosIntroduccin a Java y Eclipse22Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.En nuestras aplicaciones normalmente trabajamos con diversos conjuntos de atributos queson siempre utilizados de forma conjunta (por ejemplo, los datos de un punto en un mapa:coordenadax, coordenaday, descripcion). Estosdatossedebernirpasandoentrelasdiferentes capas de la aplicacin.PodemosutilizarelpatrnTransferObjectparaencapsularestosdatosenunobjeto,ytratarlos as de forma eficiente. Este objeto tendr como campos los datos que encapsula.Enel casodequeestoscamposseanprivados, nosdeberproporcionarmtodosparaaccederaellos. Estosmtodossonconocidoscomogettersysetters, ynospermitirnconsultaromodificarsuvalorrespectivamente. Unavezescritosloscamposprivados,Eclipse puede generar los getters y setters de forma automtica pinchando sobre el cdigofuenteconel botnderechodel ratnyseleccionandolaopcinSource>GenerateGetters and Setters.... Por ejemplo, si creamos una clase como la siguiente:public class Punto2D {private int x;private int y;private String descripcion;}Al generar los getters y setters con Eclipse aparecern los siguientes mtodos:public String getDescripcion() {return descripcion;}public void setDescripcion(String descripcion) {this.descripcion = descripcion;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}Con Eclipse tambin podremos generar diferentes tipos de constructores para estosobjetos. Por ejemplo, conla opcinSource >Generate Constructor UsingFields...generar un constructor que tomar como entrada los campos del objeto que leindiquemos.1.6.1. BeanUtilsIdealmente un mismo campo slo estar en una clase, por ejemplo, los camposcorrespondientes a los datos personales de un cliente no tienen por qu repetirse una yotravezendistintas clases. Sinembargocuandoconstruimos unTransfer Object esbastante comn que copiemos datos entre campos que tienen una correspondencia exacta.Por ejemplo, tenemos el siguiente Transfer Object que es muy similar al Punto2D:Introduccin a Java y Eclipse23Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.public class Punto3D {private int x;private int y;private int z;private String descripcion;/* ...y los getters y setters para los cuatro campos */}SinecesitamoscopiarlosdatosdePunto3DaPunto2D, tresdeloscamposcoinciden.(Esta operacin sera una proyeccin del punto sobre el plano XY). Manualmentenecesitaramos hacer:punto2D.setX(punto3D.getX());punto2D.setY(punto3D.getY());punto2D.setDescripcion(punto3D.getDescripcion());La claseBeanUtils, perteneciente a la bibliotecacommons-beanutils de Apache, nosproporciona el mtodocopyProperties(objetoDestino, objetoOrigen) que permitehacerlomismoenunasolalnea. SetratadeunwrapperquehaceusodelaAPIdeReflection. EstaAPInospermite, entreotrascosas, examinarmodificadores, tiposycampos de un objeto en tiempo de ejecucin.BeanUtils.copyProperties(punto2D, punto3D);Lo que importa es que los getters y setters que se vayan a copiar coincidan en el tipo y ensu nombre a partir del prefijo get y set. Aparte de incluir la bibliotecacommons-beanutils tambin se requiere incluircommons-logging, de la cul hace usoel mtodo copyProperties(...).Introduccin a Java y Eclipse24Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.2. Ejercicios de Introduccin al lenguaje Java2.1. Uso de interfaces (1 punto)Tenemos una aplicacin para gestionar nuestra coleccin de DVDs, en la que podemosaadir pelculas a la coleccin, eliminarlas, o consultar la lista de todas las pelculas queposeemos. EnestaaplicacintenemosunaclaseFilePeliculaDAOquenosofrecelossiguientes mtodos:public void addPelicula(PeliculaTO p);public void delPelicula(int idPelicula);public List getAllPeliculas();Estaclasenospermitiracceder alosdatosdenuestracoleccinalmacenadosenunficheroendisco. Siemprequeenalgnlugardelaaplicacinsehagaunaccesoalosdatos se utilizar esta clase. Por ejemplo, si introducimos los datos de una nueva pelculaen un formulario y pulsamos el botn para aadir la pelcula, se invocara un cdigo comoel siguiente:FilePeliculaDAO fpdao = GestorDAO.getPeliculaDAO();fpdao.addPelicula(pelicula);Laclaseauxiliar GestorDAOtieneunmtodoestticoquenospermitirobtener unainstancia de los objetos de acceso a datos desde cualquier lugar de nuestro cdigo. En elcaso anterior este mtodo sera algo as como:public static FilePeliculaDAO getPeliculaDAO() {return new FilePeliculaDAO();}Como la aplicacin crece de tamao decidimos pasar a almacenar los datos en una BD enlugar de hacerlo en un fichero. Para ello creamos una nueva clase JDBCPeliculaDAO, quedeber ofrecer las mismas operaciones que la clase anterior. Qu cambios tendremos quehacer en nuestro cdigo para que nuestra aplicacin pase a almacenar los datos en unaBD? (Imaginemos que estamos accediendo a FilePeliculaDAO desde 20 puntos distintosde nuestra aplicacin).En una segunda versin de nuestra aplicacin tenemos definida una interfazIPeliculaDAO con los mismos mtodos que comentados anteriormente. Tendremostambin la clase FilePeliculaDAO que en este caso implementa la interfazIPeliculaDAO. En este caso el acceso a los datos desde el cdigo de nuestra aplicacin sehace de la siguiente forma:IPeliculaDAO pdao = GestorDAO.getPeliculaDAO();pdao.addPelicula(pelicula);El GestorDAO ahora ser como se muestra a continuacin:public static IPeliculaDAO getPeliculaDAO() {Introduccin a Java y Eclipse25Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.return new FilePeliculaDAO();}Qu cambios tendremos que realizar en este segundo caso para pasar a utilizar una BD?Por lo tanto, qu versin consideras ms adecuada?2.2. Refactorizacin (1 punto)En las plantillas de la sesin podemos encontrar un proyectolja-filmoteca en el quetenemos implementada la primera versin de la aplicacin anterior. Realiza unarefactorizacin del cdigo para facilitar los cambios en el acceso a datos (deber quedarcomo la segunda versin comentada en el ejercicio anterior).AyudaResultar til el men Refactor de Eclipse. En l podemos encontrar opciones que nos permitanhacer los cambios necesarios de forma automtica.Una vez hechos los cambios aadir el nuevo DAOJDBCPeliculaDAO y probar a cambiarde un DAO a otro (si se ha hecho bien slo har falta modificar una lnea de cdigo). Nohar falta implementar las operaciones de los DAO. Bastar con imprimir mensajes en laconsola que nos digan lo que estara haciendo cada operacin.2.3. Documentacin (0.5 puntos)El proyecto anterior tiene una serie de anotaciones en los comentarios que nos permitengenerar documentacin Javadoc de forma automtica desde Eclipse. Observa lasanotaciones puestas en los comentarios, las marcas @param, @return, @deprecated...Genera la documentacin de este proyecto (men Project > Generate Javadoc...) en unasubcarpetadoc dentro del proyecto actual. Eclipse nos preguntar si queremos establecereste directorio como el directorio de documentacin de nuestro proyecto, a lo queresponderemos afirmativamente.Aade comentarios Javadoc a las nuevas clases creadas en el ejercicio anterior y generanuevamente la documentacin. Prueba ahora a escribir cdigo que utilice alguna de lasclases de nuestro proyecto, usando la opcin de autocompletar de Eclipse. Veremos quejunto a cada miembro de la clase nos aparecer su documentacin.2.4. Centro cultural (1 punto)Un centro cultural se dedica al prstamo de dos tipos de materiales de prstamo: discos ylibros. Para los dos se guarda informacin general, como su cdigo identificativo, el ttuloyelautor. Enelcasodeloslibros, almacenamostambinsunmerodepginasyuncaptulo de muestra, y para los discos el nombre de la discogrfica.Introduccin a Java y Eclipse26Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.Tambin podemos encontrar una serie de documentos con las normas e informacin sobreel centrodelos queguardamos suttulo, fechadepublicacinytexto. Tantoestosdocumentos como los libros se podrn imprimir (en el caso de los libros se imprimir elttulo, los autores, y el captulo de muestra, mientras que de los documentos se imprimirsu ttulo, su fecha de publicacin y su texto).Escribe la estructura de clases que consideres adecuada para representar esta informacinenunnuevoproyectolja-centrocultural. UtilizalasfacilidadesqueofreceEclipsepara generar de forma automtica los constructores y getters y setters necesarios.Introduccin a Java y Eclipse27Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.3. Colecciones de datosLa plataforma Java nos proporciona un amplio conjunto de clases dentro del que podemosencontrar tipos de datos que nos resultarn muy tiles para realizar la programacin deaplicaciones en Java. Estos tipos de datos nos ayudarn a generar cdigo ms limpio deuna forma sencilla.Se proporcionan una serie de operadores para acceder a los elementos de estos tipos dedatos.Decimosquedichosoperadoressonpolimrficos,yaqueunmismooperadorsepuedeemplear paraacceder adistintostiposdedatos. Por ejemplo, unoperador addutilizadoparaaadirunelemento,podrserempleadotantosiestamostrabajandoconuna lista enlazada, con un array, o con un conjunto por ejemplo.Este polimorfismose debe a la definicinde interfaces que debenimplementar losdistintos tipos de datos. Siempre que el tipo de datos contenga una coleccin deelementos, implementar la interfazCollection. Esta interfaz proporciona mtodos paraacceder a la coleccin de elementos, que podremos utilizar para cualquier tipo de datosque sea una coleccin de elementos, independientemente de su implementacin concreta.Podemos encontrar los siguientes elementos dentro del marco de colecciones de Java: Interfaces para distintos tipos de datos: Definirn las operaciones que se puedenrealizar con dichos tipos de datos. Podemos encontrar aqu la interfaz para cualquiercoleccin de datos, y de manera ms concreta para listas (secuencias) de datos,conjuntos, etc. Implementaciones de tipos de datos reutilizables: Son clases que implementan tiposde datos concretos que podremos utilizar para nuestras aplicaciones, implementandoalgunas de las interfaces anteriores para acceder a los elementos de dicho tipo dedatos. Por ejemplo, dentro de las listas de elementos, podremos encontrar distintasimplementaciones de la lista como puede ser listas enlazadas, o bien arrays decapacidad variable, pero al implementar la misma interfaz podremos acceder a suselementos mediante las mismas operaciones (polimorfismo). Algoritmos para trabajar con dichos tipos de datos, que nos permitan realizar unaordenacin de los elementos de una lista, o diversos tipos de bsqueda de undeterminado elemento por ejemplo.3.1. ColeccionesLas colecciones representan grupos de objetos, denominados elementos. Podemosencontrar diversostiposdecolecciones, segnsi suselementosestnordenados, osipermitimos repeticin de elementos o no.Es el tipo ms genrico en cuanto a que se refiere a cualquier tipo que contenga un grupode elementos. Viene definidopor la interfaz Collection, de la cual heredar cadaIntroduccin a Java y Eclipse28Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.subtipo especfico. En esta interfaz encontramos una serie de mtodos que nos servirnpara acceder a los elementos de cualquier coleccin de datos, sea del tipo que sea. Estosmtodos generales son:boolean add(Object o)Aade un elemento (objeto) a la coleccin. Nos devuelve true si tras aadir el elemento lacoleccin ha cambiado, es decir, el elemento se ha aadido correctamente, o false en casocontrario.void clear()Elimina todos los elementos de la coleccin.boolean contains(Object o)Indica si la coleccin contiene el elemento (objeto) indicado.boolean isEmpty()Indica si la coleccin est vaca (no tiene ningn elemento).Iterator iterator()Proporciona un iterador para acceder a los elementos de la coleccin.boolean remove(Object o)Eliminaundeterminadoelemento(objeto) delacoleccin, devolviendotruesi dichoelemento estaba contenido en la coleccin, y false en caso contrario.int size()Nos devuelve el nmero de elementos que contiene la coleccin.Object [] toArray()Nos devuelve la coleccinde elementos comounarrayde objetos. Si sabemos deantemanoquelosobjetosdelacoleccinsontodosdeundeterminadotipo(comoporejemplo de tipoString) podremos obtenerlos en un array del tipo adecuado, en lugar deusar un array de objetos genricos. En este caso NO podremos hacer una conversin castdescendente de array de objetos a array de un tipo ms concreto, ya que el array se habrinstanciado simplemente como array de objetos:// Esto no se puede hacer!!!String [] cadenas = (String []) coleccion.toArray();Lo que si podemos hacer es instanciar nosotros un array del tipo adecuado y hacer unaconversincastascendente(detipoconcretoaarraydeobjetos),yutilizarelsiguientemtodo:String [] cadenas = new String[coleccion.size()];coleccion.toArray(cadenas); // Esto si que funcionarIntroduccin a Java y Eclipse29Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.Esta interfaz es muygenrica, ypor lotantonohayningntipode datos que laimplemente directamente, sinoque implementarnsubtipos de ellas. Acontinuacinveremos los subtipos ms comunes.3.1.1. Listas de elementosEste tipo de coleccin se refiere a listas en las que los elementos de la coleccin tienen unorden, existe una secuencia de elementos. En ellas cada elemento estar en unadeterminada posicin (ndice) de la lista.Las listas vienen definidas en la interfazList, que adems de los mtodos generales delas colecciones, nos ofrece los siguientes para trabajar con los ndices:void add(int indice, Object obj)Inserta un elemento (objeto) en la posicin de la lista dada por el ndice indicado.Object get(int indice)Obtiene el elemento (objeto) de la posicin de la lista dada por el ndice indicado.int indexOf(Object obj)Nos dice cual es el ndice de dicho elemento (objeto) dentro de la lista. Nos devuelve -1 siel objeto no se encuentra en la lista.Object remove(int indice)Elimina el elemento que se encuentre en la posicin de la lista indicada mediante dichondice, devolvindonos el objeto eliminado.Object set(int indice, Object obj)Estableceel elementodelalistaenlaposicindadaporel ndiceal objetoindicado,sobrescribiendo el objeto que hubiera anteriormente en dicha posicin. Nos devolver elelemento que haba previamente en dicha posicin.Podemos encontrar diferentes implementaciones de listas de elementos en Java:ArrayListImplementa una lista de elementos mediante un array de tamao variable. Conforme seaaden elementos el tamao del array ir creciendo si es necesario. El array tendr unacapacidad inicial, y en el momento en el que se rebase dicha capacidad, se aumentar eltamao del array.Las operaciones de aadir un elemento al final del array (add), y de establecer u obtenerel elemento en una determinada posicin (get/set) tienen un coste temporal constante. Lasinserciones y borrados tienen un coste lineal O(n), donde n es el nmero de elementos delarray.Introduccin a Java y Eclipse30Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.Hemos de destacar que la implementacin de ArrayList no est sincronizada, es decir, simltiples hilos acceden a un mismo ArrayList concurrentemente podriamos tenerproblemas en la consistencia de los datos. Por lo tanto, deberemos tener en cuenta cuandousemosestetipodedatosquedebemoscontrolarlaconcurrenciadeacceso. Tambinpodemos hacer que sea sincronizado como veremos ms adelante.VectorEl Vectoresunaimplementacinsimilar al ArrayList, conladiferenciadequeelVectorsi que est sincronizado. Esteesuncasoespecial, yaquelaimplementacinbsica del resto de tipos de datos no est sincronizada.Esta clase existe desde las primeras versiones de Java, en las que no exista el marco delas colecciones descrito anteriormente. En las ltimas versiones el Vector se haacomodado a este marco implementando la interfaz List.Sin embargo, si trabajamos con versiones previas de JDK, hemos de tener en cuenta quedicha interfaz no exista, y por lo tanto esta versin previa del vector no contar con losmtodos definidos en ella. Los mtodos propios del vector para acceder a su contenido,que han existido desde las primeras versiones, son los siguientes:void addElement(Object obj)Aade un elemento al final del vector.Object elementAt(int indice)Devuelve el elemento de la posicin del vector indicada por el ndice.void insertElementAt(Object obj, int indice)Inserta un elemento en la posicin indicada.boolean removeElement(Object obj)Elimina el elementoindicadodel vector, devolviendotrue si dichoelementoestabacontenido en el vector, y false en caso contrario.void removeElementAt(int indice)Elimina el elemento de la posicin indicada en el ndice.void setElementAt(Object obj, int indice)Sobrescribe el elemento de la posicin indicada con el objeto especificado.int size()Devuelve el nmero de elementos del vector.Porlotanto, si programamosparaversionesantiguasdelamquinavirtual Java, serrecomendable utilizar estos mtodos para asegurarnos de que nuestro programa funcione.Esto ser importante en la programacin de Applets, ya que la mquina virtual incluida enIntroduccin a Java y Eclipse31Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.muchos navegadores corresponde a versiones antiguas.Sobre el vector se construye el tipo pila (Stack), que apoyndose en el tipo vector ofrecemtodos para trabajar condichovector comosi se tratase de una pila, apilandoydesapilando elementos (operaciones push y pop respectivamente). La claseStack heredadeVector, porloqueenrealidadserunvectorqueofrecemtodosadicionalesparatrabajar con l como si fuese una pila.LinkedListEn este caso se implementa la lista mediante una lista doblemente enlazada. Por lo tanto,el costetemporal delasoperacionesserel deestetipodelistas. Cuandorealicemosinserciones, borrados o lecturas en los extremos inicial o final de la lista el tiempo serconstante, mientras queparacualquier operacinenlaquenecesitemos localizar undeterminado ndice dentro de la lista deberemos recorrer la lista de inicio a fin, por lo queel coste ser lineal con el tamao de la lista O(n), siendo n el tamao de la lista.Para aprovechar las ventajas que tenemos en el coste temporal al trabajar con losextremosdelalista, seproporcionanmtodospropiosparaaccederaellosentiempoconstante:void addFirst(Object obj) / void addLast(Object obj)Aade el objeto indicado al principio / final de la lista respectivamente.Object getFirst() / Object getLast()Obtiene el primer / ltimo objeto de la lista respectivamente.Object removeFirst() / Object removeLast()Extraeel primer / ltimoelementodelalistarespectivamente, devolvindonosdichoobjeto y eliminndolo de la lista.Hemosdedestacarqueestosmtodosnospermitirntrabajarconlalistacomosi setratasedeunapilaodeunacola. Enel casodelapilarealizaremoslainsercinylaextraccindeelementosporelmismoextremo,mientrasqueparalacolainsertaremospor un extremo y extraeremos por el otro.3.1.2. ConjuntosLosconjuntossongruposdeelementosenlosquenoencontramosningnelementorepetido. Consideramosqueunelementoestrepetidositenemosdosobjetoso1yo2iguales, comparandolos mediante el operador o1.equals(o2). De esta forma, si el objeto ainsertarenelconjuntoestuvieserepetido, nonosdejarinsertarlo. Recordemosqueelmtodo add devolva un valor booleano, que servir para este caso, devolviendonos truesi el elemento a aadir no estaba en el conjunto y ha sido aadido, o false si el elementoya se encontraba dentro del conjunto. Un conjunto podr contener a lo sumo un elementonull.Introduccin a Java y Eclipse32Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.Los conjuntos se definen en la interfazSet, a partir de la cul se construyen diferentesimplementaciones:HashSetLos objetos se almacenan en una tabla de dispersin (hash). El coste de las operacionesbsicas(insercin,borrado,bsqueda)serealizanentiempoconstantesiemprequeloselementos se hayan dispersado de forma adecuada. La iteracin a travs de sus elementoses ms costosa, ya que necesitar recorrer todas las entradas de la tabla de dispersin, loqueharqueel costeestenfuncintantodel nmerodeelementosinsertadosenelconjunto como del nmero de entradas de la tabla. El orden de iteracin puede diferir delorden en el que se insertaron los elementos.LinkedHashSetEs similar a la anterior pero la tabla de dispersin es doblemente enlazada. Los elementosque se inserten tendrn enlaces entre ellos. Por lo tanto, las operaciones bsicas seguirnteniendocoste constante, conla carga adicional que supone tener que gestionar losenlaces. Sinembargohabrunamejoraenlaiteracin, yaqueal establecerseenlacesentre los elementos no tendremos que recorrer todas las entradas de la tabla, el coste sloestar en funcin del nmero de elementos insertados. En este caso, al haber enlaces entrelos elementos, estos enlaces definirn el orden en el que se insertaron en el conjunto, porlo que el orden de iteracin ser el mismo orden en el que se insertaron.TreeSetUtilizaunrbol parael almacenamientodeloselementos. Porlotanto, el costepararealizar las operaciones bsicas ser logartmico con el nmero de elementos que tenga elconjunto O(log n).3.1.3. MapasAunque muchas veces se hable de los mapas como una coleccin, en realidad no lo son,ya que no heredan de la interfaz Collection.Los mapas se definen en la interfazMap. Un mapa es un objeto que relaciona una clave(key)conunvalor. Contendrunconjuntodeclaves, yacadaclaveseleasociarundeterminado valor. En versiones anteriores este mapeado entre claves y valores lo haca laclase Dictionary, quehaquedadoobsoleta. Tantolaclavecomoel valor puedesercualquier objeto.Los mtodos bsicos para trabajar con estos elementos son los siguientes:Object get(Object clave)Nos devuelve el valor asociado a la clave indicadaObject put(Object clave, Object valor)Introduccin a Java y Eclipse33Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.Inserta una nueva clave con el valor especificado. Nos devuelve el valor que tena antesdicha clave, o null si la clave no estaba en la tabla todava.Object remove(Object clave)Elimina una clave, devolviendonos el valor que tena dicha clave.Set keySet()Nos devuelve el conjunto de claves registradasint size()Nos devuelve el nmero de parejas (clave,valor) registradas.Encontramos distintas implementaciones de los mapas:HashMapUtiliza una tabla de dispersin para almacenar la informacin del mapa. Las operacionesbsicas (get y put) se harn en tiempo constante siempre que se dispersen adecuadamentelos elementos. Es coste de la iteracin depender del nmero de entradas de la tabla y delnmero de elementos del mapa. No se garantiza que se respete el orden de las claves.TreeMapUtiliza un rbol rojo-negro para implementar el mapa. El coste de las operaciones bsicasser logartmicoconel nmerode elementos del mapa O(logn). Eneste casoloselementos se encontrarn ordenados por orden ascendente de clave.HashtableEs unaimplementacinsimilar a HashMap, peroconalgunadiferencia. Mientras lasanteriores implementaciones no estn sincronizadas, esta si que lo est. Adems en estaimplementacin, al contrario que las anteriores, no se permitirn claves nulas (null). Esteobjeto extiende la obsoleta claseDictionary, ya que viene de versiones ms antiguas deJDK. Ofrece otros mtodos adems de los anteriores, como por ejemplo el siguiente:Enumeration keys()Este mtodo nos devolver una enumeracin de todas las claves registradas en la tabla.3.1.4. WrappersLa claseCollections aporta una serie mtodos para cambiar ciertas propiedades de laslistas. Estos mtodos nos proporcionan los denominados wrappers de los distintos tiposde colecciones. Estos wrappers son objetos que 'envuelven' al objeto de nuestracoleccin, pudiendodeestaformahacer quelacoleccinestsincronizada, oquelacoleccin pase a ser de solo lectura.Comodijimos anteriormente, todos los tipos de colecciones noestnsincronizados,Introduccin a Java y Eclipse34Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.excepto el Vector que es un caso especial. Al no estar sincronizados, si mltiples hilosutilizan la coleccin concurrentemente, podrn estar ejecutndose simultneamente variosmtodosdeunamismacoleccinquerealicendiferentesoperacionessobreella. Estopuede provocar inconsistencias en los datos. A continuacin veremos un posible ejemplode inconsistencia que se podra producir:1. Tenemos un ArrayList de nombre letras formada por los siguiente elementos: [ "A","B", "C", "D" ]2. Imaginemos que un hilo de baja prioridad desea eliminar el objeto "C". Para ello haruna llamada al mtodo letras.remove("C").3. Dentro de este mtodo primero deber determinar cul es el ndice de dicho objetodentro del array, para despus pasar a eliminarlo.4. Se encuentra el objeto "C" en el ndice 2 del array (recordemos que se empieza anumerar desde 0).5. El problema viene en este momento. Imaginemos que justo en este momento se leasigna el procesador a un hilo de mayor prioridad, que se encarga de eliminar elelemento "A" del array, quedndose el array de la siguiente forma: [ "B", "C", "D" ]6. Ahora el hilo de mayor prioridad es sacado del procesador y nuestro hilo sigueejecutndose desde el punto en el que se qued.7. Ahora nuestro hilo lo nico que tiene que hacer es eliminar el elemento del ndice quehaba determinado, que resulta ser el ndice 2!. Ahora el ndice 2 est ocupado por elobjeto "D", y por lo tanto ser dicho objeto el que se elimine.Podemos ver que haciendo una llamada a letras.remove("C"), al final se ha eliminado elobjeto "D", lo cual produce una inconsistencia de los datos con las operacionesrealizadas, debido al acceso concurrente.Este problema loevitaremos sincronizandola coleccin. Cuandouna coleccinestsincronizada, hastaquenoterminederealizarseunaoperacin(inserciones, borrados,etc), no se podr ejecutar otra, lo cual evitar estos problemas.Podemos conseguir que las operaciones se ejecuten de forma sincronizada envolviendonuestro objeto de la coleccin con un wrapper, que ser un objeto que utiliceinternamente nuestra coleccin encargndose de realizar la sincronizacin cuandollamemos a sus mtodos. Para obtener estos wrappers utilizaremos los siguientes mtodosestticos de Collections:Collection synchronizedCollection(Collection c)List synchronizedList(List l)Set synchronizedSet(Set s)Map synchronizedMap(Map m)SortedSet synchronizedSortedSet(SortedSet ss)SortedMap synchronizedSortedMap(SortedMap sm)Comovemostenemosunmtodoparaenvolvercadatipodedatos. Nosdevolverunobjeto con la misma interfaz, por lo que podremos trabajar con l de la misma forma, sinembargo la implementacin interna estar sincronizada.Podemos encontrar tambin una serie de wrappers para obtener versiones de slo lecturaIntroduccin a Java y Eclipse35Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.de nuestras colecciones. Se obtienen con los siguientes mtodos:Collection unmodifiableCollection(Collection c)List unmodifiableList(List l)Set unmodifiableSet(Set s)Map unmodifiableMap(Map m)SortedSet unmodifiableSortedSet(SortedSet ss)SortedMap unmodifiableSortedMap(SortedMap sm)3.1.5. GenricosPodemos tener colecciones de tipos concretos de datos, lo que permite asegurar que losdatos que se van a almacenar van a ser compatibles con un determinado tipo o tipos. Porejemplo, podemos crear unArrayList que slo almaceneStrings, o unaHashMap quetome como claves Integers y como valores ArrayLists. Adems, con esto nosahorramoslasconversionescast al tipoquedeseemos, puestoquelacoleccinyaseasume que ser de dicho tipo.Ejemplo// Vector de cadenasArrayList a = new ArrayList();a.add("Hola");String s = a.get(0);a.add(new Integer(20)); // Dara error!!// HashMap con claves enteras y valores de vectoresHashMap hm = new HashMap();hm.put(1, a);ArrayList a2 = hm.get(1);A partir de JDK 1.5 deberemos utilizar genricos siempre que sea posible. Si creamos unacoleccinsinespecificarel tipodedatosquecontendrnormalmenteobtendremosunwarning.Los genricos no son una caracterstica exclusiva de las colecciones, sino que se puedenutilizar enmuchasotrasclases, inclusopodemosparametrizar deestaformanuestraspropias clases.3.1.6. Recorrer las coleccionesVamosaverahoracomopodemositerarporloselementosdeunacoleccindeformaeficiente y segura, evitando salirnos del rango de datos. Dos elementos utilizadoscomunmente para ello son las enumeraciones y los iteradores.Las enumeraciones, definidas mediante la interfazEnumeration, nos permiten consultarlos elementos que contiene una coleccin de datos. Muchos mtodos de clases Java quedebendevolver mltiplesvalores, loquehacenesdevolvernosunaenumeracinquepodremos consultar mediante los mtodos que ofrece dicha interfaz.La enumeracin ir recorriendo secuencialmente los elementos de la coleccin. Para leercada elemento de la enumeracin deberemos llamar al mtodo:Introduccin a Java y Eclipse36Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.Object item = enum.nextElement();Que nos proporcionar en cada momento el siguiente elemento de la enumeracin a leer.Adems necesitaremos saber si quedan elementos por leer, para ello tenemos el mtodo:enum.hasMoreElements()Normalmente, el bucle para la lectura de una enumeracin ser el siguiente:while (enum.hasMoreElements()) {Object item = enum.nextElement();// Hacer algo con el item leido}Vemos como en este bucle se van leyendo y procesando elementos de la enumeracin unoa uno mientras queden elementos por leer en ella.Otro elemento para acceder a los datos de una coleccin son los iteradores. La diferenciaestenquelos iteradores adems deleer los datos nos permitirneliminarlos delacoleccin. Los iteradores se definen mediante la interfaz Iterator, que proporciona deforma anloga a la enumeracin el mtodo:Object item = iter.next();Que nos devuelve el siguiente elemento a leer por el iterador, y para saber si quedan mselementos que leer tenemos el mtodo:iter.hasNext()Adems, podemos borrar el ltimo elemento que hayamos leido. Para ello tendremos elmtodo:iter.remove();Por ejemplo, podemos recorrer todos los elementos de una coleccinutilizandouniterador y eliminar aquellos que cumplan ciertas condiciones:while (iter.hasNext()){Object item = iter.next();if(condicion_borrado(item))iter.remove();}Las enumeraciones y los iteradores no son tipos de datos, sino elementos que nos servirnpara acceder a los elementos dentro de los diferentes tipos de colecciones.A partir de JDK 1.5 podemos recorrer colecciones y arrays sin necesidad de acceder a susiteradores, previniendo ndices fuera de rango.Ejemplo// Recorre e imprime todos los elementos de un arrayint[] arrayInt = {1, 20, 30, 2, 3, 5};for(int elemento: arrayInt)System.out.println (elemento);Introduccin a Java y Eclipse37Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.// Recorre e imprime todos los elementos de un ArrayListArrayList a = new ArrayList();for(String cadena: a)System.out.println (cadena);3.1.7. Cuestiones de eficienciaTradicionalmente Java se ha considerado un lenguaje lento. Hoy en da Java se utiliza enaplicaciones con altsimas exigencias de rendimiento y rapidez de respuesta, por ejemplo,Apache SolR. Para obtener un rendimiento adecuado es fundamental utilizar lasestructuras de datos idneas para cada caso, as como los mtodos adecuados.Por ejemplo hay que tener en cuenta que una lista mantiene un orden (anterior ysiguiente), mientras que unArrayList mantiene elementos en posiciones. Si eliminamosun elemento al principio de la lista, todos los dems son desplazados una posicin.Mtodos como addAll o removeAll son preferibles a un bucle que itere sobre la lista.En general es bueno pensar en cul va a ser el principal uso de una estructura de datos yconsiderar su complejidad computacional. Hacer una prueba de tiempos con una cantidadlimitada de datos puede darnos una idea errnea, si no probamos distintos tamaos de losdatos. En la siguiente figura se muestran las complejidades computacionales de algunosmtodos de colecciones:Complejidad computacional de mtodos de coleccionesOtrascuriosidadesquevalelapenaconocerestnenumeradasen"5thingsyoudidn'tknow about the Java Collecitons Api":http://www.ibm.com/developerworks/java/library/j-5things2/index.htmlhttp://www.ibm.com/developerworks/java/library/j-5things3/index.html.3.2. Comparacin de objetosComparar objetosesfundamental parahacer ciertasoperacionesymanipulacionesenestructuras de datos. Por ejemplo, saber si un objeto es igual a otro es necesario a la horade buscarlo en una estructura de datos.3.2.1. Sobrecarga de equalsTodos losObject y clases derivadas tienen un mtodoequals(Object o) que comparaun objeto con otro devolviendo un booleano verdadero en caso de igualdad. El criterio deigualdad puede ser personalizado, segn la clase. Para personalizarlo se puedesobrecargar el mtodo de comparacin:public class MiClase {Introduccin a Java y Eclipse38Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved....@Overridepublic boolean equals(Object o) {// return true o false, segn un criterio}}El mtodoequals no debe sobrecargarse si no es necesario. Sobre todo hay que evitarsobrecargarlo en casos como los siguientes: Cada instancia es intrnsecamente nica. Por ejemplo, instancias de hilos, querepresentan entidades activas, y no tan slo un conjunto de valores. Cuando no es necesaria una comparacin lgica. Por ejemplo, dos nmeros aleatorios,donde la igualdad puede ocurrir pero su comprobacin no es necesaria. Una superclase ya sobrecarga equals, y el comportamiento de ste es apropiado parala clase actual.Cuando se sobrecarga el mtodo equals se deben cumplir las siguientes propiedades: Reflexividad: x.equals(x) devuelve siempre verdadero, si no es nulo. Simetra: para cualquier par de instancias no nulas, x.equals(y) devuelve verdaderosi y slo si y.equals(x) tambin devuelve verdadero. Transitividad: si x.equals(y)==true y y.equals(z)==true, entonces x.equals(z)tambin ser verdadero, para cualesquiera instancias no nulas. Consistencia: mltiples llamadas al mtodo con las mismas instancias devuelven elmismo resultado. Comparacin con null falsa: x.equals(null) devuelve falsoPara asegurar la propiedadde consistencia tambinconviene sobrecargar el mtodohashCode, que es necesariopara que funcionencorrectamente todas las coleccionesbasadas en cdigos hash, como HashMap, HashSet, Hashtable. Objetos que seconsideren iguales deben devolver hashCode iguales. Debe cumplirse: Cuando hashCode es invocado varias veces para el mismo objeto, debe devolverconsistentemente el mismo entero, siempre que no se haya modificado ningunainformacin que afecte al resultado de equals. Esta consistencia debe mantenerseentre distintas ejecuciones de la misma aplicacin. Si dos objetos son iguales segn equals, entonces los mtodos hashCode de ambosdeben devolver el mismo entero. Si dos objetos no son iguales segn equals, no se require que devuelvan hashCodediferentes. No obstante en la medida de lo posible deben ser distintos porque estopuede mejorar la eficiencia de las tablas hash.3.2.2. Implementacin de ComparableHay algoritmos, comoCollections.sort( ), que requieren que los objetos tengan unmtodocompareTo()quedevuelvaunnmeronegativo, positivoocero, segnsi unobjeto es menor que el otro, mayor, o igual. Este mtodo no viene enObject para poderIntroduccin a Java y Eclipse39Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.sobrecargarlo, sino en la interfazComparable que tenemos que implementar, y que nosobligar a implementar tambin el mtodo compareTo.Por supuesto, no todos los objetos se pueden comparar en trminos de mayor o menor.As, el hecho de que una clase implementeComparable nos indica que se trata de unaestructura de datos cuyos objetos s son comparables, y por tanto podran ordenarse.Un ejemplo de implementacin de Comparable:public class Persona implements Comparable {public int id;public String apellido;...@Overridepublic int compareTo(Persona p) {return this.id - p.id;}}3.2.3. Comparador externoEn muchas estructuras de datos la ordenacin podra ser subjetiva. Por ejemplo, las fichasdeclientes podranconsiderarsemayores omenores segnel identificador, segnelapellido o segn la fecha de alta. La estructura de datos no tiene por qu ofrecer todas lasposibilidades de comparacin. En estos casos, en los que no hay un slo orden inherente ala estructura de datos, podemos utilizar un comparador externo.Para ello tenemos que implementar la interfazComparator que nos obliga a implementarel mtodocompare. Al tratarse, una vez ms, de una interfaz, podramos hacerlo dentrode la propia clase cuyas instancias vamos a comparar, o bien en otra clase aparte, como enel siguiente ejemplo:public class ComparaPersonaPorNombre implements Comparator{public int compare(Persona p1, Persona p2) {return p1.apellido.compareToIgnoreCase(p2.apellido);}}Para hacer uso de ese comparador externo en algn mtodo, debemos indicarlo pasandouna instancia delComparator. En cambio si queremos utilizar el mtodo de comparacinComparable.compareTo( ), sobra con que la clase implemente Comparable.List personas = new ArrayList();personas.add(p1); personas.add(p2); personas.add(p3); //...Collections.sort(personas); //Comparable.compareToCollections.sort(personas, new ComparaPersonaPorNombre());//Comparator.compareIntroduccin a Java y Eclipse40Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.3.3. Polimorfismo e interfacesEnJavapodemosconseguirtenerobjetospolimrficosmediantelaimplementacindeinterfaces. Unclaroejemploestenlascoleccionesvistasanteriormente. Porejemplo,todos los tipos de listas implementan la interfazList. De esta forma, en un mtodo queacepte como entrada un objeto de tipo List podremos utilizar cualquier tipo queimplemente esta interfaz, independientemente del tipo concreto del que se trate.Es por lo tanto recomendable hacer referencia siempre a estos objetos mediante la interfazqueimplementa, ynopor sutipoconcreto. Deestaformaposteriormentepodramoscambiarlaimplementacindel tipodedatossinqueafecteal restodel programa. Lonico que tendremos que cambiar es el momento en el que se instancia.Por ejemplo, si tenemos una claseCliente que contiene una serie de cuentas, tendremosalgo como:public class Cliente {String nombre;List cuentas;public Cliente(String nombre) {this.nombre = nombre;this.cuentas = new ArrayList();}public List getCuentas() {return cuentas;}public void setCuentas(List cuentas) {this.cuentas = cuentas;}public void addCuenta(Cuenta cuenta) {this.cuentas.add(cuenta);}}Si posteriormentequeremoscambiar laimplementacindelalistaa LinkedListporejemplo, slotendremos que cambiar la lnea del constructor enla que se hace lainstanciacin.Comoejemplodelautilidadquetieneel polimorfismopodemos ver los algoritmospredefinidos con los que contamos en el marco de colecciones.3.3.1. Ejemplo: AlgoritmosComo hemos comentado anteriormente, adems de las interfaces y las implementacionesdelostiposdedatosdescritosenlosapartadosprevios, el marcodecoleccionesnosofrece una serie de algoritmos utiles cuando trabajamos con estos tipos de datos,especialmente para las listas.Introduccin a Java y Eclipse41Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.Estosalgoritmoslospodemosencontrarimplementadoscomomtodosestticosenlaclase Collections. En ella encontramos mtodos para la ordenacin de listas (sort), parala bsqueda binaria de elementos dentro de una lista (binarySearch) y otras operacionesque nos sern de gran utilidad cuando trabajemos con colecciones de elementos.Estos mtodos tienen como parmetro de entrada un objeto de tipoList. De esta forma,podremos utilizar estos algoritmos para cualquier tipo de lista.3.4. Tipos de datos bsicos en las colecciones3.4.1. Wrappers de tipos bsicosHemos visto que en Java cualquier tipo de datos es un objeto, excepto los tipos de datosbsicos: boolean, int, long, float, double, byte, short, char.Cuandotrabajamos concolecciones de datos los elementos que contienenstas sonsiempre objetos, por lo que en un principio no podramos insertar elementos de estos tiposbsicos. Parahacer estoposibletenemos unaseriedeobjetos queseencargarndeenvolver aestos tipos bsicos, permitindonos tratarlos comoobjetos ypor lotantoinsertarlos como elementos de colecciones. Estos objetos son los llamados wrappers, y lasclases en las que se definen tienen nombre similares al del tipo bsico que encapsulan,con la diferencia de que comienzan con mayscula: Boolean, Integer, Long, Float,Double, Byte, Short, Character.Estas clases, adems de servirnos para encapsular estos datos bsicos en forma de objetos,nos proporcionan una serie de mtodos e informacin tiles para trabajar con estos datos.Nosproporcionarnmtodosporejemploparaconvertircadenasadatosnumricosdedistintos tipos y viceversa, as como informacin acerca del valor mnimo y mximo quese puede representar con cada tipo numrico.3.4.2. AutoboxingEsta caracterstica aparecida en JDK1.5 evita al programador tener que establecercorrespondencias manuales entre los tipos simples (int, double, etc) y suscorrespondientes wrappers o tipos complejos (Integer, Double, etc). Podremosutilizar un int donde se espere un objeto complejo (Integer), y viceversa.EjemploArrayList a = new ArrayList();a.add(30);Integer n = v.get(0);n = n+1;int num = n;Introduccin a Java y Eclipse42Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.4. Ejercicios de colecciones4.1. Implementaciones e interfaces (1 punto)Tenemos una clase como la siguiente para encapsular los datos de una pelcula, en la quese almacena, entre otros campos, la lista de actores:public class PeliculaTO {String titulo;ArrayList actores;ArrayList directores;public PeliculaTO() {actores = new ArrayList();directores = new ArrayList();}public ArrayList getActores() {return actores;}public void addActor(String actor) {actores.add(actor);}}Como segunda opcin, tenemos una implementacin alternativa como la siguiente:public class PeliculaTO {String titulo;List actores;List directores;public PeliculaTO() {actores = new ArrayList();directores = new ArrayList();}public List getActores() {return actores;}public void addActor(String actor) {actores.add(actor);}}Imaginemos que ms adelante comprobamos que se hacen un gran nmero deoperaciones deborradooinsercinenmitaddelalista, ydecidimos queseramseficienteutilizarunLinkedList. Si nuestraclaseperteneceaunalibreraqueseestutilizandodesdemltiplespuntosdeunagranaplicacin, qucambiosimplicaraelpasar autilizar unalistaenlazadaencadaunadelas dos versiones?Cul deellasconsideras por lo tanto ms apropiada?4.2. Uso de listas (1.5 puntos)Introduccin a Java y Eclipse43Copyright 2012-13 Dept. Ciencia de la Computacin e IA All rights reserved.Vamos a aadir a nuestro proyecto de gestin de filmotecas de la sesin anterior un nuevoDAO que manejar datos en memoria, en lugar de guardarlos en fichero o base de datos.AesteDAOlellamaremos MemoryPeliculaDAO, yutilizarinternamentecoleccionespara almacenar las pelculas. Deberemos poder aadir pelculas, eliminarlas, o ver la listade todas las pelculas que tengamos. Se pide:a) Las operaciones ms comunes que haremos en la aplicacin van a consistir en aadirunapelculaalfinaldelalista, eliminarunapelculadadosuidentificador(habrquebuscarla en la lista), u obtener el listado de todas las pelculas y recorrerlo entero paramostrarlo. Qu tipo de coleccin consideras ms apropiada para almacenar estainformacin?.b) Aadir el cdigo necesario a las operaciones para agregar pelculas y consultar la listade pelculas disponibles. Comprobar que la aplicacin funciona correctamente.c) Consideraremos que dos pelculas son la misma si su identificador coincide. Aadir elcdigo necesario a la clasePeliculaTO para que esto sea as. Comprobar que funcionacorrectamente implementando