Está en la página 1de 987
PIENSA EN JAVA PIENSA EN JAVA Cuarta Edicién BRUCE ECKEL President, MindView, Inc. Traduccién Vuelapluma PEARSON = cc Hall Madrid @ México ® Santa Fe de Bogota @ Buenos Aires @ Caracas @ Lima Montevideo @ San Juan @ San José @ Santiago @ So Paulo @ White Plains @ Datos de catalogaciin biiogriea PIENSA EN JAVA Brace kel PEARSON EDUCACION S.A., Maid, 2007, ISBN; 978:649966-034.2 Materia: tnormatica, 004 Ponmat: 215 x 270m, Phginas: 1004 ‘Todos fos deteciios reservados. Queda prohibida, salvo excepcién prevista en la Ley, cualquier forma de reproduccién, distribucién, comunica- cin pablica y transformacién de esta obra sin contar con autorizacién de los titulares de propiedad intelectual La infraceién de los derechos mencionados puede ser constitutiva de delito contra la propiedad intelectual (arts. 270 y sgis. Cdigo Penal). DERECHOS RESERVADOS: (© 2007 por PEARSON EDUCACION S.A. Ribera del Loira, 28 28042 Madrid PIENSA EN JAVA Bruce Eckel ISBN: 978-84-8966-034-2 Deposito Lewal: M-4,753-2007 PRENTICE HALL es un sello editorial autorizado de PEARSON EDUCACION S.A. Authorized translation fiom the English language edition, catilled THINKING IN JAVA, 4 Edition by ECKEL BRUCE, published by Pearson Education Inc, publishing as Prentice Hall, Copyright © 2006 EQUIPO EDITORIAL Editor: Miguel Martin-Romo ‘Técnico editorial: Marta Caicoya EQUIPO DE PRODUCCION: Director: José A. Clares ‘Técnico: Maria Alvear Diseiio de Cubierta: Equipo de diseio de Pearson Kdueacién S.A. Impreso por: Grificas Rigar, S. A. IMPRESO EN ESPANA - PRINTED IN SPAIN Ese libro ha sido impreso con ppelytinaseoolpicos Dedicatoria A Dawn Prefacio Originalmente, me enfienté a Java como si fuera “simplemente otro Lenguaje mis de progrumacién™, lo cual es cierto en muchos sentidos. Pero, a medida que fue pasando el tiempo y lo fui estudiando con mayor detalle, comencé a ver que el objetivo fundamen- tal de este lenguaje era distinto de los demas lenguajes que habia visto hasta el momento. La tarea de programacién se basa en gestionar la complejidad: la complejidad del problema que se quiere resolver, sumada a la complejidad de la maquina en Ja cual hay que resolverlo. Debido a esta complejidad, la mayoria de los proyectos de programacién terminan fallando. A pesar de lo cual, de todos los lenguajes de programacién que conozco, casi ninguno de ellos habia adoptado como principal objetivo de disefio resolver la complejidad inherente al desarrollo y el mentenimiento Ge los programas. Por supuesto, muchas decisiones del disenio de lenguajes se realizan teniendo presente esa complejidad, pero siempre termina por considerarse esencial introducir otros problemas dentro del conjunto de los objetivos. Inevitablemente, son estos otros problemas los que hacen que los programadotes terminen no pudiendo cumplir el objetivo principalmente con esos lenguajes. Por ejemplo, C++ tenia que ser compatible en sentido descendente con C (para permitir una facil migracién a los programadores de C), ademés de ser un lenguaje eficiente. Ambos objetivos resultan muy iitiles y explican parte del éxito de C++, pero también afiaden un grado adicional de complejidad que impide a algunos proyectos finalizar (por supuesto, podemos echar la culpa a los programadores y a los gestores, pero si un lenguaje puede servir de ayuda detectando los errores que cometemos, {por qué no utilizar esa posibilidad?). Otro ejemplo, Visual BASIC (VB) esta- ba ligado a BASIC, que no habia sido disefiado para ser un lenguaje extensible, por lo que todas las extensiones afladidas a VB han dado como resultado una sintaxis verdaderamente inmanejable. Perl es compatible en sentido descendente con awk, sed, grep y otras herramientas Unix a las que pretendia sustituir, y como resultado, se le acusa a menudo de generar "c6di- go de sélo escritura" (es decir, después de pasado un tiempo se vuelve completamente ilegible). Por otro lado, C+, VB, Perl y otros lenguajes como Smalltalk han centrado algo de esfuerzo de disefio en la cuestién de Ia complejidad, y como resultado, ha tenido un gran éxito a la hora de resolver ciertos tipos de problemas. Lo que mas me ha impresionado cuando he legado a entender el lenguaje Java es que dentro del conjunto de objetivos de diseiio establecido por Sun, parece que se hubiera decidido tratar de reducir la complejidad para ef programador, Como si guiienes marearon esos objetivos hubieran dicho: "Tratemos de reducir el tiempo y la dificultad nevesarios para generar c6di- 0 robusto". Al principio, este objetivo daba como resultado un cédigo que no se ejecutaba especialmente ripido (aunque esto ha mejorado a 1o largo del tiempo), pero desde luego ha permitido reducir considerablemente el tiempo de desarrollo, que es inferior en un 50 por ciento © incluso més al tiempo necesario para crear un programa en C++ equivalente. mplemente por esto, ya podemos ahorrar cantidades enormes de tiempo y de dinero, pero Java no se detiene ahi, sino que trata de hacer transparentes muchas de las complejas tareas que han Llegado a ser importantes en el mundo de la programa- cidn, como la utilizacion de miiltiples hebras o la programacién de red, empleando para conseguir esa transparencia una serie de caracteristicas del lenguaje y de bibliotecas preprogramadas que pueden hacer que muchas tareas Ileguen a resultar sencillas. Finalmente, Java aborda algunos problemas realmente complejos: programas interplataforma, cambios de eédigo dindmicos incluso cuestiones de seguridad, todos los cuales representan problemas de una complejidad tal que pueden hacer fracasar proyectos completos de programacién. Por tanto, a pesar de los problemas de prestaciones, las oportunida- «des que Java nos proporciona son inmensas, ya que puede incrementar significativamente nuestra productividad como pro- gramadores. Java incrementa el ancho de banda de comunicacién entre las personas en todos los sentidos: a la hora de erear los pro- gramas, a la hora de trabajar en grupo, a la hora de construir interfaces para comunicarse con los usuarios, a la hora de ' Sin embargo, ereo que el lenguaje Python es l que mis se acerea a ese objetivo. Consulte wwn:Pythonorg. xx Piensa en Java cjecutar los programas en diferentes tipos de maquinas y a la hora de escribir con sencillez aplicaciones que se comuniquen a través de Internet. En mi opinion, los resultados de la revohuci6n de las comunicaciones no se percibirin a partir de los efectos de desplazar grandes cantidades de bits de un sitio a otro, sino que seremos conscientes de la verdadera revolucién a medida que veamos emo podemos comunicamos con los demis de manera més sencilla, tanto en comunicaciones de persona a persons, como cn grupos repartidos por todo ¢l mundo. Algunos sugieren que la siguiente revolucién seri la formacién de una especie de ‘mente global derivada de la intereonexién de un mimero suficiente de personas. No sé si Java llegard a ser la herramicnta que fomente dicha revolucién, pero esa posibilidad me ha hecho sentir, al menos, que estoy haciendo algo importante al tra- ‘ar de ensefiar este lenguaje. Java SE5 y SE6 Esta edicién del libro aprovecha en buena medida las mejoras realizadas al lenguaje Java en lo que Sun originalmente deno- mind JDK 1.5 y cambié posteriormente a JDKS 0 J2SE5. Posteriormente, la empresa elimin6 el obsoleto “2” y cambid el nombre a Java SES, Muchos de los cambios en el lenguaje Java SES fueron decididos para mejorar la experiencia de uso del programador. Como veremos, los disefiadores del lenguaje Java no obtuvieron un completo éxito en esta tarea, pero en general dieron pasos muy significativos en la direccién correcta, Uno de los objetivos mis importantes de esta edicién es absorber de manera completa las mejoras introducidas por Java 'SES/6, presentarlas y emplearlas a lo largo de todo el texto. Esto quiere decir que en esta edicién se ha tomado la dura deci- sién de hacer el texio tinicamente compatible con Java SES/6, por lo que buena parte del eédigo det libro no puede compi- larse con las versiones anteriores de Java; el sistema de generacién de eédigo dari errores y se detendiré si se intenta efectuar esa compilacién, A pesar de todo, creo que los beneficios de este enfoque compensan el riesgo asociado a dicha deci Si el lector prefiere por algin motivo las versiones anteriores de Java, se puede descargar el texto de las versiones anterio- res de este libro (en inglés) en la direccion www. MindView.net, Por diversas razones, la edicién actual del libro no esta en formato electrénico gratuito, sino que sélo pueden descargarse las ediciones anteriores Java SE6 La redaceién de este libro ha sido, en si misma, un proyecto de proporciones colosales y al que ha habido que dedicar mucht- simo tiempo. Y antes de que el libro fuera publicado, la versién Java SE6 (cuyo nombre en clave es mustang) aparecié en versién beta. Aunque hay unos cuantos cambios de menor importancia en Java SEG que mejoran algunos de los ejemplos {ncluidos en el libro, el tratamiento de Java SE6 no ha afectado en gran medida al contenido del texto; las principales mejo- ras de la nueva versién se centran en el aumento de la velocidad y en determinadas funcionalidades de biblioteca que eaian fuera del alcance del texto. El cédigo ineluido en el libro ha sido comprobado con una de las primeras versiones comerciales de Java SE6, por lo que no creo que vayan a producirse cambios que afecten al contenido del texto. Si hubiera algtin cambio importante a la hora de lanzar oficialmente JavaSE6, ese cambio se vera reflejado en el cédigo fuente del libro, que puede descargarse desde www. MindFiewnet En la portada del libro se indica que este texto es para “Java SES/6”, lo que significa “escrito para Java SES teniendo en cuenta los significativos cambios que dicha versién ha introducido en el lenguaje, pero siendo el texto igualmente aplicable a Java SE6”. La cuarta edicién La principal satisfaccién a la hora de realizar una nueva edicién de un libro es la de poder “corregit” el texto, aplicando todo aquello que he podido aprender desde que Ia ultima edicién viera la luz. A menudo, estas lecciones son derivadas de esa frase que dice: “Aprender es aquello que conseguimos cuando no conseguimos lo que queremos”, y escribir una nueva edi- cién de! libro constituye siempre una oportunidad de corregir errores o hacer més amena ta lectura. Asimismo, a la hora de abordar una nueva edicién vienen a la mente nuevas ideas fascinantes y la posibilidad de cometer nuevos errores se ve mis que compensada por el placer de descubrir nuevas cosas y la capacidad de expresar las ideas de una forma mas adecuada. Prefacio 2x1 Asimismo, siempre se tiene presente, en el fondo de la mente, ese desafio de escribir un libro que los poseedores de las edi- ciones anteriores estén dispuestos a comprar. Ese desafio me anima siempre a mejorar, reescribir y reorganizar todo lo que puedo, con el fin de que el libro constituya una experiencia nueva y valiosa para los lectores més fieles. Cambios EI CD-ROM que se habfa incluido tradicionalmente como parte del libro no ha sido incluido en esta edicién. La parte esen- cial de dicho CD, el seminario multimedia Thinking in C (creado para MindView por Chuck Allison), esté ahora disponible como presentacién Flash descargable. E] objetivo de dicho seminario consiste en preparar a aquellos que no estén lo sufi- cientemente familiatizados con Ia sintaxis de C, de manera que puedan comprender mejor el material presentado en este libro. Aunque en dos de los capitulos del libro se cubre en buena medida la sintaxis a un nivel introductorio, puede que no sean suficientes para aquellas personas que carezcan de los conocimientos previos adecuados, y la presentacién Thinking in C trata de ayudar a dichas personas a aleanzar el nivel necesario. El capitulo dedicado a la concurrencia, que antes Llevaba por titulo “Programacién multihebra”, ha sido completamente rees- crito con el fin de adaptarlo a los cambios principales en las bibliotecas de concurrencia de Java SES, pero sigue proporcio- nando informacién basica sobre las ideas fundamentales en las que la concurrencia se apoya. Sin esas ideas fundamentales, resulta dificil comprender otras cuestiones mas complejas relacionadas con la programacién multihebra. He invertido muchos meses en esta tarea, inmerso en ese mundo denominado “concurrencia” y el resultado final es que el capftulo no sélo proporciona los fundamentos del tema sino que también se aventura en otros territorios mis novedosos. Existe un nuevo capitulo dedicado a cada una de las principales caracteristicas nuevas del lenguaje Java SES, y el resto de Jas nuevas caracteristicas han sido reflejadas en las modificaciones realizadas sobre cl material existente. Debido al estudio continuado que realizo de los patrones de diseiio, también se han introducido en todo el libro nuevos patrones. El libro ha sufrido una considerable reorganizacién, Buena parte de los cambios se deben a razones pedagégicas, junto con Ja perfeccion de que quiz’ mi concepto de “capitulo” necesitaba ser revisado, Adicionalmente, siempre he tendido a creer que un tema tenfa que tener “la suficiente envergadura” para justificar cl dedicarle un capitulo. Peto hugo he visto, espe- cialmente a la hora de ensefiar los patrones de diseio, que las personas que asistian a los seminarios obtenian mejores resul- tados si se presentaba un nico patrén y a continuacién se hacia, inmediatamente, un ejercicio, incluso si eso significaba que yo slo hablara durante un breve periodo de tiempo (asimismo, descubri que esta nueva estructura era més agradable para el profesor). Por tanto, en esta versién del libro he tratado de descomponer los capitulos segiin los temas, sin preocuparme de la longitud final de cada capitulo, Creo que el resultado representa una auténtica mejora, También he legado a comprender la enorme importancia que tiene el tema de las pruebas de cédigo. Sin un marco de prue- bas predefinido, con una serie de pruebas que se ejecuten cada vez que se consteuys el sistema, no hay forma de saber si el cédigo es fiable o no. Para conseguir este objetivo en el libro, he creado un marco de pruebas que permite mostrar y vali- dr la salida de cada programa (dicho marco esté escrito en Python, y puede descargarse en www: MindView.net. El tema de Jas pruebas, en general, se trata en cl suplemento disponible en itp:/vww.MindView.net/Books/BellerJava, que presenta lo ue creo que son eapacidades fundamentales que todos los programadores deberian tener como parte de sus conocimientos basicos. Adem, he repasado cada uno de los ejemplos del libro pregunténdome a mi mismo: “;Por qué lo hice de esta manera?” En la mayorfa de los casos, he realizado algunas modificaciones y mejoras, tanto para hacer los ejemplos mAs coherentes entre si, como para demostrat lo que considero que son las reglas practicas de programacién en Java, (al menos dentro de los limites de un texto introductorio). Para muchos de los ejemplos existentes, se ha realizado un redisefio y una nueva implementacién con cambios significativos con respecto a las versiones anteriores. Aquellos ejemplos que me parecia que ya no tenian sentido han sido eliminados y se han afiadido, asimismo, nuevos ejemplos. Les lectores de las ediciones anteriores han hecho numerosisimos comentarios muy pertinentes, lo que me llena de satisfae- cidn, Sin embargo, de vez en cuando también me llegan algunas quejas y, por alguna razén, una de las mis frecuentes es que “este libro es demasiado voluminoso”. En mi opinién, si la tinica queja es que este libro tiene “demasindas péiginas”, creo que el resultado global es satisfactorio (se me viene a la mente el comentario de aquel emperador de Ausiria que s¢ quejaba de la obra de Mozart diciendo que tenia “demasiadas notas”; por supuesto, no trato en absoluto de compararme con Mozart). Ademas, debo suponer que ese tipo de quejas proveden de personas que todavia no han Hegado a familiarizarse con la enorme variedad de caracteristicas del propio lenguaje Java y que no han tenido ocasién de consultar el resto de libros dedicados a este tema, De todos modos, una de las cosas que he tratado de hacer en esta edicidn es recortar aquellas partes xaxll_ Piensa en Java que han Hlegado a ser obsoletas, 0 al menos, no esenciales. En general, se ha repasado todo el texto eliminando lo que ya habia dejado de ser necesario, incluyendo los cambios pertinentes y mejorando el contenido de la mejor manera posible, No ‘me importa demasiado eliminar algunas partes, porque el material original correspondiente continia estando en el sitio web (wn MindView.ned), gracias a la version descargable de las tres primeras ediciones del libro, Asimismo, el lector tiene a su disposicién material adicional en suplementos descargables de esta edicién, En cualquier caso, para aquellos lectores que sigan considerando excesivo el tamaiio del libro les pido disculpas. Lo crean ‘ono, he hecho cuanto estaba en mi mano para que ese tamatio fuera el menor posible. Sobre el disefo de la cubierta La cubierta del libro esta inspirada por el movimiento American Arts & Crafts Movement que comenzé poco antes del cam- bio de siglo y aleanzé su cenit entre 1900 y 1920. Comenzé en Inglaterra como reaccién a Ia produccién en masa de Ia revo- lucién industrial y al estilo altamente oramental de la época victoriana, Arts & Crafts enfatizaba el disefio con formas naturales, como en el movimiento art nouveau, como el trabajo manual y la importancia del artesano, sin por ello renunciar al uso de herramientas modemas. Existen nmuchos ecos con la situacién que vivimos hoy en dia: el cambio de siglo, la evo- lucién desde los rudimentarios comienzos de ta revolucién informatica hacia algo més refinado y significativo y el énfasis ‘en la artesania del software en lugar de en su simple manufactura. La concepciéin de Java tiene mucho que ver con este punto de vista. Es un intento de elevar al programador por encima del sistema operative, para transformarlo en un “artesano del softwar ‘Tanto el autor de este libro como el diseftador de ta cubierta (que son amigos desde Ia infuncia) han encontrado inspiracién en este movimiento, ambos poseemos muebles, limparas y otros abjetos originales de este periodo o inspirados en el mismo. B] otro tema de la cubierta sugiere una vitrina coleccionista que un naturalista podria emplear para mostrar los especimenes de insectos que ha preservado. Estos insectos son objetos situados dentro de los objetos compartimento. Los objetos com- partimento estén a su vez, colocados dentro del “objeto cubierta”, lo que ilustra el concepto de agregacién dentro de Ia pro- ‘gramacién orientada 1 objetos. Por supuesto, cualquier programador de habla inglesa efectuard enseguida entre los insectos “bugs” y los errores de programacién (también bugs). Aqui, esos insectos/errores han sido capturados y presumiblemente ‘muertos en un tarro y confinados finalmente dentro de una vitrina, con lo que tratamos de sugerir la habilidad que Java tiene para encontrar, mosirar y comegir los errores (habilidad que consttuye tno de sus mais potentes atributos). En esta edicién, yo me he encargado de la acuarela que puede verse como fondo de la cubierta. Agradecimientos En primer lugar, gracias a todos los colegas que han trabajo conmigo a la hora de impartir seminarios, realizar labores de consultoria y desarrollar proyectos pedagégicos: Dave Bartlet, Bill Venners, Chuck Allison, Jeremy Meyer y Jamie King. Agradezco ia paciencia que mostriis mientras continéo tratando de desarrollar el mejor modelo para que una serie de per- sonas independientes como nosotros puedan continuar trabajando juntos. Recientemente, y gracias sin duda a Internet, he tenido la oportunidad de relacionarme con un mimero sorprendentemente grande de personas que me ayudan en mi trabajo, usualmente trabajando desde sus propins oficinas. En el pasado, yo ten- drfa que haber adquirido o alquilado una gran oficina para que todas estas personas pudieran trabajar, pero gracias a Internet, ‘los servicios de mensajeros y al teléfono, ahora puedo contar con su ayuda sin esos costes adicionales. Dentro de mis inten- tos por aprender a “trabajar eficazmente con los demas”, todos vosotros me habéis ayudado enormemente y espero poder continuar aprendiendo a mejorar mi trabajo gracias a los esfuerzos de otras. La ayuda de Paula Steuer ha sido valiosisima a la hora de tomar mis poco inteligentes pricticas empresariales y transformarlas en algo razonable (gracias por ayudarme cuando no quiero eneargarme de algo concreto, Paula). Jonathan Wilcox, Esq., se encargé de revisar la estructura de mi empresa y de eliminar cualquier piedra que pudiera tener un posible escorpién, haciéndonos marchar disciplinadamente a través del proceso de poner todo en orden desde el punto de vista legal, gracias por tu minuciosidad y tu persistencia. Sharlynn Cobaugh ha llegado a convertirse en una auténtica experta en ediciin de sonido y ha sido una de as personas esen- ciales a la hora de crear los cursos de formacién multimedia, ademas de ayudar en la resolucién de muchos otros proble~ mas. Gracias por la perseverancia que has demostrado a la hora de enfrentarte con problemas informéticos complejos. La gente de Amaio on Praga tambien ha sido de gran ayuda en numerosos proyectos. Danie! Will-Harris fue mi primera fuen- Prefacio xxiii te de inspiracién en lo que respecta al proyecto de trabajo a través de Intemet y también ha sido imprescindible, por supues- 10, en todas las soluciones de disefio grfieo que he desarrollado. Alo largo de los afios, a través de sus conferencias y seminarios, Gerald Weinberg se ha convertido en mi entrenador y men- tor extraoficial, por lo que le estoy enormemente agradecido. Ervin Varga ha proporcionado mumerosas correcciones técnicas para la cuarta edicién, aunque también hay otras personas que han ayudado en esta tarea, con diversos capitulos y ejemplos. Ervin ha sido el revisor técnico principal del libro y tam- bign se encargé de escribir la guia de soluciones para la cuarta edicidn. Los errores detectados por Ervin y las mejoras que 41 ha introducido en el libro han permitido redondear el texto. Su minuciosidad y su atencién al detalle resultan sorprenden- tes y es, con mucho, el mejor revisor téenico que he tenido. Muchas gracias, Ervin Mi weblog en la pagina www.drtima.com de Bill Venners también ha resultado de gran ayuda a la hora de verificar deter- minadas ideas. Gracias a los lectores que me han ayudado a aclarar los conceptos enviando sus comentarios; entre esos lec- ores debo citar a James Watson, Howard Lovatt, Michael Barker, y @ muchos otros que no menciono por falta de espacio, en particular a aquellos que me han ayudado en el tema de los genéricos, Gracias a Mark Welsh por su ayuda contimuada. Evan Cofsky contintia siendo de una gran ayuda, al conocer de memoria todos los arcanos detalles relativos a la configura- cién y mantenimiento del servidor web basados en Linux, asi como a la hora de mantener optimizado y protegido el servi- dor MindView. Gracias especiales a mi nuevo amigo el café, que ha permitido aumentar enormemente el entusiasmo por el proyecto. Camp Coffee en Crested Butte, Colorado, ha llegado a ser el lugar de reunién normal cada ver. que alguien venia a los seminarios de MindView y proporciona el mejor catering que he visto para los descansos en el seminario. Gracias a mi colega Al Smith por crear ese café y por convertirlo en un lugar tan extraordinario, que ayuda a hacer de Crested Butte un lugar mucho mas interesante y placentero, Gracias también a todos los camareros de Camp4, que tan servicialmente atienden a sus clientes. Gracias a la gente de Prentice Hall por seguir atendiendo a todas mis peticiones, y por facilitarme las cosas en todo momen- to. Hay varias herramientas que han resultado de extraordinaria utilidad durante el proceso de desarrollo y me siento en deuda con sus creadores cada vez que las uso. Cygwin (www.eygwin.com) me ha permitido resolver innumerables problemas que Windows no puede resolver y cada dia que pasa mas me engancho a esta herramienta (me hubiera encantado disponer de ella hace 15 afios, cuando tenia mi mente orientada a Gnu Emacs). Eclipse de [BM (www.eclipse.org) representa una mara- villosa contribucién 2 Ia comunidad de desarrolladores y cabe esperar que se puedan obtener grandes cosas con esta herra- mienta a medida que vaya evolucionando, JetBrains IntelliJ Idea continia abriendo nuevos y creativos caminos dentro del campo de las herramientas de desarrollo. Comencé a utilizar Enterprise Architect de Sparxsystems con este libro y se ha convertido répidamente en mi herramienta UML favorita. El formateador de cédigo Jalopy de Marco Hunsicker (ww.triemax.com) también ha resultado muy ttil en numerosas ocasiones y Marco me ha ayudado extraordinariamente a la hora de configurarlo para mis necesidades concre- tas, En mi opinion, la herramienta JEdit de Slava Pestoy y sus correspondientes plug-ins también resulian ities en diversos momentos (www:jedit.org); esta herramienta es un editor muy adecuado para todos aquellos que se estén iniciando en el desarrollo de seminarios. Y por supnesto, por si acaso no lo he dejado claro aim, utilizo constantemente Python (www.Python.org) para resolver pro- blemas, esta herramienta es la criatura de mi colega Guido Van Rossum y de la panda de enloquecidos genios con los que disfruté enormemente haciendo deporte durante unos cuantos dias (a Tim Peters me gustaria decirle que he enmarcado ese ratén que tomé prestado, al que le he dado el nombre oficial de “TimBotMouse"’). Permitidme tan slo recomendaros que busqueis olros lugares mas sanos para comer. Asimismo, mi agradecimiento a toda la comunidad Python, formada por un conjunto de gente extraordinaria. Son muchas las personas que me han hecho Hegar sus correcciones y estoy en deuda con todas ellas, pero quiero dar las gra- cias en particular a (por la primera edicidn): Kevin Raulerson (cncontré numerosisimos errores imperdonables), Bob Resendes (simplemente increible), John Pinto, Joe Dante, Joe Sharp (fabulosos vuestros comentarios), David Combs (nume- rosas correeciones de clarificacién y de gramética), Dr. Robert Stephenson, John Cook, Franklin Chen, Zev Griner, David Karr, Leander A. Stroschein, Steve Clark, Charles A. Lee, Austin Maher, Dennis P. Roth, Roque Oliveira, Douglas Dunn, Dejan Ristic, Neil Galameau, David B, Malkovsky, Steve Wilkinson, y muchos otros. El Profesor Mare Meurrens dedic6 xxiv. Piensa en Java una gran cantidad de esfuerzo a publicitar y difundir la version electrénica de la primera edicién de este libro en Europa, Gracias a todos aquellos que me han ayudado a reescribir los ejemplos para utilizar la biblioteca Swing (para la segunda edicién), asf como a los que han proporeionado otros tipos de comentarios: Jon Shvarts, Thomas Kirsch, Rahim Adatia, Rajesh Jain, Ravi Manthena, Banu Rajamani, Jens Brandt, Nitin Shivaram, Malcolm Davis y a todos los dems que me han ‘manifestado su apoyo. En la cuarta edicién, Chris Grindstaff resulté de gran ayuda durante el desarrollo de la seccién SWT y Sean Neville escri- bi6 para mi el primer borrador de la seccién dedicada a Flex. Kraig Brockschmidt y Gen Kiyooka son algunas de esas personas inteligentes que he podido conocer en algin momento de vida y que an legado a ser auténticos amigos, habiendo tenido una enorme influencia sobre mi. Son personas poco usua- les en el sentido de que practican yoga y otras formas de engrandecimiento espiritual, que me resultan particularmente ins- piradoras e instructivas. Me resulta somprendente que el saber de Delphi me ayudara a comprender Java, ya que ambos lenguajes tienen en comin muchos conceptos y decisiones relativas al diseito del lenguaje, Mis amigos de Delphi me ayudaron enormemente a la hora de entender mejor ese maravilloso entomo de programacion. Se trata de Marco Cantu (otro italiano, quizé el ser educado en latin mejora las aptitudes de uno para los lenguajes de programacién), Neil Rubenking (que solia dedicarse al yoga, 1s coi da vegetariana y el Zen hasta que descubrié las computadoras) y por supuesto Zack Urlocker (el jefe de producto original de Delphi), un antiguo amigo con el que he recorrido el mundo. Todos nosotros estamos en deuda con el magnifico Anders Hejlsberg, que continia asombrandonos con C# (lenguaje que, como veremos en el libro, fue una de las principales inspi- raciones para Java SES). Los consejos y el apoyo de mi amigo Richard Hale Shaw (al igual que tos de Kim) me han sido de gran ayuda, Richard y yo hemos pasado muchos meses juntos impartiendo seminarios y tratando de mejorar los aspectos pedagégicos con el fin de que los asistentes distrutaran de una experiencia perfecta, El disefo del libro, el disefto de la cubierta y la fotografia de la cubierta han sido realizados por mi amigo Daniel Will-Harris, renombrado autor y diseftador (www Will-Harris.com), que ya solia crear sus propios diseftos en ef colegio, mientras espe- raba a que se inventaran las computadoras y las herramientas de autoedicién, y que ya entonces se quejaba de mi forma de resolver los problemas de algebra, Sin embargo, yo me he encargado de preparar pata imprenta las paginas, por lo que los errores de fotocomposicién son mios, He utilizado Microsoft® Word XP para Windows a la hora de escribir el libro y de preparar las piginas para imprenta mediante Adobe Acrobat; este libro fue impreso directamente a partir de los archivos Acrobat PDF. Como tributo a la era electrénica yo me encontraba fuera del pais en el momento de producir la primera y la segunda ediciones finales del libro; la primera edicién fue envinda desde Ciudad del Cabo (Suditfrica), mientras que la segunda edicién fue enviada desde Praga. La tercera y cuarta ediciones fueron tealizadas desde Crested Butte, Colorado. En la versién en inglés del libro se utilizé el tipo de letra Georgia para el texto y los titulos estén en Verdana. La letra de la cubierta original es JTC Rennie Mackintosh. Gracias en especial a todos mis profesores y estudiantes (que también son mis profesores). Mi gato Molly solia sentarse en mi regazo mientras trabajaba en esta edicién, ofreciéndome asi mi propio tipo de apoyo peludo y calido, Entre los amigos que también me han dado su apoyo, y a los que dcbo citar (aunque hay muchos otros a los que no cito por falta de espacio), me gustaria destacar a: Patty Gast (extraordinaria masajista), Andrew Binstock, Steve Sinofsky, JD Hildebrandi, Tom Keffer, Brian McBlhinney, Brinkley Barr, Bill Gates en Midnight Engineering Magazine, Lamy Constantine y Lucy Lockwood, Gene Wang, Dave Mayer, David Intersimone, Chris y Laura Strand, 1os Almquists, Brad Jerbie, Marilyn Cvitanie, Mark Mabry, la familia Robbins, a famitia Moelter (y 1os MeMillans), Michael Wilk, Dave Stoner, Jos Cranstons, Larry Fogg, Mike Sequeira, Gary Entsminger, Kevin y Sonds Donovan, Joe Lordi, Dave y Brenda Bartlett, Patti Gast, Blake, Annette & Jade, 1os Rentschlers, los Sudeks, Dick, Patty, y Lee Eckel, Lynn y Todd, y sus familias. Y por supuesto, a mamé y papa. Resumen del contenido Prefacio Introduce : Introduccién @ los objetos. Todo es un objeto........ Operadores ... Control de ejecucién, Inivializacién y limpieza . Control de 2cc@S0........0essevesesserseeeee RewkilieachOhi de ClaseS..isecensasiesvaaeansacoioe eesurerseaedensy Polimorfismo... Interfaces 410 Clases internas . 4 11 Almacenamiento de objetos 12 Tratamiento de errores mediante excepciones 13 Cadenas de caracteres 414 Informacién de tipos 45 Genéricos. 16 Matrices 417 Andlisis detallado de los contenedores ....2.....sssessseseeseteeeees 1B EIS... 419 Tipos enumerados . 20 Anotaciones. .. 21 Concurrencia.........s.202 : : 22 Interfaces gréficas de USUATIO. 2.2... ceseeecesseteesetseaerseeees A Suplementos . B Recursos . Indice .. eearonnen a Contenido Prefacio xix Java e Internet ce coe I6 Java SES y SE6 _ Qué es fa Web?.. es Java SES ncceeceenertenua et Programaciin del lado de ctionte sl8 Lacuna edicibo...,- Programacia del lado del servidor 21 Cambios Resumen Sobre el disefio de Ia cubjerta, 2 Todo es un objeto se eden een eew eens Agealecisneane, Los objetos se manipulan mediante referencias 23, Wntroducdl6n.....6si+2 56 Es necesario crear todos los objetos er Prerequisites som Los lugares de almacenamiento 24 Aprendiendo Java ...... sees ee Xl Caso especial ips primitivas 2 Odjetivos ... cece ai ‘Mairices en Java... 26 Ensefiar com este bro weil Nunca es necesatio destcur un objeto ei Documentacién del JDK en HTML... xxvii Ambito, ” Ejercicios . xxvii Ambito de Jos objetos 2 Fundamentos pars Java ces XN Creaeiéin de nuevos tpos de datos: class Cédigo fuente ceeeee eee VE Cap ERR scssss seearea rer Estindares de codificacion : sain ‘Metodos, argumentos y valores de retorn, . Errores aK La fista de srgumeton 4 Introduccién a los objetos........20..2.6024 Construceién de un programa Java... 31 Et piogresn le ahenbea. 1 Visibitidad de los nombres 3 Todo objeto tiene una intrfaz 3 Usiizacén de otros cormponentes eal Un objeto proporciona servicios. 4 Lapalabr cave static... ...0+. se La implementacion oculta. ‘i 5 Nuestro primer programs Java 33 Reutilizacién de la implementacin 6 Compilacin y ejeeucion 35 Herencia 6 Comentarias y documentacién embebida........35 Ralaciacaa sth eee, 5 Documentacibn mediante comentarios .......--.36 Objetos intercambiables con polimorfismo 9 Sintais. oo. 0+ Seteeeeseeesnnee 36 La jerarquia de raiz tinica seems HTML embebide a7 Comtenedores. ...... oor emrets Algunos marcadores de ejemplo a7 “Tipos parascrizados (genéieos) B Ejerplo de documentcion 239 CCreacién y vida de los objetos ......-. B Estilo de codification... eseeeeeee eee es 39 Tratamiento de excepeiones: manejo de errores. 1S Resumen ..-.----+ ceceseeee sO 5 Ejereicios. ...... cone enes Programacién concurrent ‘ x Pionsa on Java 3 Operadores . sevsrscreweces sR Sobrecanga con pimitvas 9 Instrucciones simples de impresién B ae eee ee ae Uilzacién de os operadores Java na Constructors predeterminados, Picaancda 14 La palabra clave this ... nla, secscenes meen Invocacin de constuctoves desde otros Creacién de alias en las Hamadas a métodos. 46 Sonsinictones z= Operadores matematicos. . cece M6 ee ene 98 raisin us cast. s Limpieza: finalizacién y seuracn de = Autoineremento y autodecremento,. 248 eee a ‘Opeidota fuaciiaalae sea ‘Es necesario efectuar las tareas de limpieza ...... 98 Comprobscin dete ” La condvén de twomiacisn ° Operadores ios. a Sai cin ee da ari 1 ee we SE Inicializacién de miembros = 102 Literales. Notciém exponencia ......cesssssiseeses SM Operadores bit a bit... 6.6.66. seee eens SS Operadores de desplazamiento eerstast Iniiliznion de datas ests. 106 Operador temario ies... “ Iniitienién sta explicit 10s Operadares iy + pare Sing. 2 Tnicializacién de instancias no estiticas ........ 109 Errores comunes a la hora de utilizar operadores. 60 WeibelalieaicSi de aaron, Operadores de proyeccion ® Lists variables de arguments ..........00. 13 “Truncamienoy redandeo a ipa iid Frowmeoe: a Resumen Java no tiene operador “sizeof”. ~@ 6 Control de acceso. Compediio de operadores eo Seas . 0 package: la unidad de biblioteca 122 & ‘Cont de elect, Oxpnizacin del ebige «....sesesesssseses 123 Creacion de nombres de pagueteunivocos 124 true y false. Una biblioteca personalizada de herramicntas .... 126 ifelse... Utiizacién de importaciones para motifiest Mteracion. ... 2+ 400+ seeeeenes “BR el comportamiento * eo 128 do-while. B ‘Un consejo sobre los nombres de paquete....... 128 | Fspecificadores de wcces0 Java... 128 Eloperador coma... 4 Acceso de paquete 129 Sintexis foreach : 4 uence deere 129 wefara 6 Private: jno Jo toque! . . oe BO break y continue n protected; acoso ds beeen Bt La despreciada insruccién “goto” . 78 Interfax ¢ immplementacion 13 switch... aL Acceso de clase . 134 Resumen . Resumen .... sees 136 5 Iniclazacién y Iinpleza.. . 7 Reutilizacién de clases 139 Inivializaciba garantizads con el constructor... 8S Sica aga 139 Sobrecnrgn de métodos......... 97 Sintaxis de In here : 142 ‘les dng re mbites sbrsarad 58 iniitizacidn de acs base sss vesee 14 Delegacion ..csssccseeseee 145 Combinacién de la composicién ye la herencia nse (Cémo garantizar una limpieza apropiada ....... 148 cultacidn de nombres = oo ASD ‘Cémo elegir entre la composicidn y la herencia 152 protected ....... sources Upeasting (generalizacién).... 134 Por qué “npcasting™ 155 ‘Nueva comparacin entre Ia composicion yla here... seveorraens eros La palabra clave final... 156 Datos final 156 Método final... 2.2... 139 (Clases final... : ‘ 46t ‘Una advertencia sobre final 2. 161 Inicializacién y carga de clases........ 162 Inicializacién con erencis aurrege sel Resumen . -163 8 Polimorfismo ..... . 165 Nuevas consideraciones sobre Ja generalizacién 165 Porque olvidar et tipo de un objeto... 5... 4.166 El secreto, = 168, Acoplamiento de tas Hamad 8 métodos 168 Especificacin del comportamiento eorreeto 168 Amplibilidad, seocasracas vances HA reo: “sustitucn'” de métodos private 173 Error: campos y métodos static cece 1 Constructores y polimorfismo (Orden de las Hamada alos constructors... 176 erenciay lpia cece ITT ‘Comportamiento de los métodos polimérficos dentro de los consructores 181 Tipos de retomo covariantes «2... .2...- 183 Disefio de sistemas con herencia 183, Sustitucién y extensin : 84 Bspecializacime infmacién de tipos en tiempo de cjecaeion 186 Resumen a wens 187 9 Interfaces .. 189 Clases abstractas y métodos abstiactos ....... 189 Interfaces... anemnutivy 192 Desacoplamiento completo... .e.e.c...4. 198 “Herencia mitiple” en Java... eee cc ee 199 41 Almacenamiento de objetos. Contenido xt Ampliacién de la interfaz mediante herencia. 201 CColisiones de nombres al combinar interfaces... 202 Adaptacién a una interfaz 203 Campos en las interfaces cece 205 Inicslizvién de campos en las interfaces. ...... 205 Anidamiento de interfaces cee eee 206 Interfaces y factorias 208 Resumen 2210 10 Clases internas ..... 2 (Creacién de clases internas axceva2ll El enlace con la clase extema.......2.00....213 Urilizacion de this yanew 0... .eccseees 214 Clases intema y generalizacién 216 Clases intemas en los métodos y dmbitos ..... 217 Clases internas andnimas : 219 Un mucvo andlisis det método fuctoia ...,.... 222 Clase anidadas. 0. eee eecees 224 ‘Clases dentro de meres eco sen 228 ‘Acceso al exterior desde una clase mllplemente anidads esa {Para qué se tusan las clases internas? 207 Ceres y retrolamada . 229 (Clases iiernas y mareos de contol .,....-...230 Como heredar de elases intemas . 2236 {Pueden sustituirse las clases internas? 236 Clases internas locales sovenees e238 entificadores de una clase intema ........239 Resumen Genéricos y coutenedores seguros respecto al tipo Conceptos bisicos. 7 Adicién de grupos de elementos ........-...245 Impresion de contenedores List a8 Iterator... ..0.205 252 Listhterator. 254 LinkedList AAat ee Blinc. ceeeeneenenee cessor e256 set cote ceseeee e258 Map. 260 Queue . 263 PriorityQuewe...... oe 264 Comparacién entre Collection ¢ Iterator .....266 xii, Piensa en Java La estructura foreach y los iteradores ........ 268 El método basado en adaptadones 270 Resumen . 273 12 Tratamiento de errores mediante excepciones ........+++400006277 Conceptos ......-. a7 Excepciones bisicas 8 Argumentos de las excepciones 29 Deteceién de una exeepeién 279 El blogue try « 280 ‘Rutinas de tratamiento de excepciones 280 Creaciéa de nuestras propias excepciones.... 281 Excepoionesy registto.. 283 La especificacién de la excepciin . .. 286 Como capturar una exeepeién . 286 ‘La traza dela pila 288 Regeneraiin de na excepei6a 289 neadenamiento de excepciones sees 291 Excepeiones estindar de Java. 294 Caso especial: RuntimeBxeeption 294 Realizacién de tarcas de limpicza con finally .. 295 Para qué seve finally? 296 Utilizacin de finally durant i ejecucién de la instruc return. 299 Unemor: In exeepeién pedida oo 30 Restriociones de las excepciones . 2-301 Constructores +303 Localizacién de excepeiones . .. Enfoques alternstivos Historia. Perspectvas .. aso de las excepeiones la consol ‘Conversién de las exeepeiones comprobadas fen no comprobadas ...2.0.eesseeveeessee 313 Directrices relativas a las excepciones ...... Resumen oa 13 Cadenas de caracteres. Cadenas de earacteres inmutables ‘Comparacién entre In sobrecarga de “Hy StringBuilder ..........-. Recursién no intencionada -32 Operaciones con cadenas de caracteres 322 Formateo de Ia salida 2324 rine, 324 System.out.format() Laclase Formatter Especiffcadores de formato Conversiones posibles con Formater ‘String format(), Expresiones regulares Fundamentos bisicos. Creaciéin de expresiones regulates, Cumntiticadores Pattern y Matcher split). Operaciones de sustitcién resel() Expresiones regulares y B/S en Java Analisis de la entrada ae Delimitadores de Seanmer re Analisis con expresiones regulares StringTokenizer Resumen 14 Informacién de tipos. La necesidad de RTTI EL objeto Class . Literals de ease Referencias de clase yenrieas [Nacva sintaxs de peoyeccion Comprobacin antes de una proyeccion, Uiilizacida de litrales de clase Instaaceof dinimico Reovento recursive, Factorias registradas 6. instanceof y equivalencia de clases Reflexién: informacidn de clases en tiempo de ‘jecucién Un extractor de métodos de clases Proxies dimimicos. Objetos malos ee ‘Objetos maqueta y stubs Interfaces ¢ informacién de tipos Resumen 15 Genéricos ...... ‘Comparacién con CH". Genéricos simples. ... Una biblioteca de plas 324 ms 2326 327 329 331 331 333 3s 336 342 343 344 345 M6 348 348 449 350 381 353 2387 359 361 361 2367 368 369 371 33 374 375 378 381 387 387 392, cones 394 396 ‘Una clase que implementa una pila 398 RandomList 399 Interfaces genéricas .. 399 Métodos genéricos . 403, “Aproveshamiento de lainfereneia del argumento de bpo seasseeee cl \arargs y meds genéricos 405 ‘Un metodo genérice para utilizar con sgeneradores sateen ove 406 Un generader de propasito general 407 ‘Simplificacin del uso de las tuplas oo 408 Una uilidad Set 65.2.6. sesss4e e409 (Clases intemas anénimas .......2.626.0065 412 ‘Construceién de modelos complejos 43 El misterio del borrado aus ‘La teenies usa en CO peers ‘Compatibilidad de la miacion al El problema dal bortado de tipos 419 Bl efecto de fos limites... ee ceeeeseeeee421 ‘Compensaciin del borrado de tipos 424 (Creacién de instaneias de tips 2.0. cose 005 Matrioes de genéricos sesnenee eT Limites ... ¥ 431 Comodines witstcireeosa5 AM ‘Mlasta qué punto es intcligente el compilsdoe? .. 436 Contravarianza i ce AB ‘Comodines no limitados svceeee ee MO Conversion de eapturs 44 Problemas - 445 ‘No pueden usarse primitivas como parimetros 8c tipo . asst 44s Implementacin de interfaces parametrizadas....447 Proyeceiones do tipos y advertencias 447 Sobrecane --.e..eee ee eT) ‘Secuesto de uns interliz por parte de Ia ease base 449 Tipos autolimitados. .. savcvaceeseos4SO Genéricos curiosamente recurrentes oe 850 Autolimitacién : 431 Covarianza de argumentos we ASB Seguridad dinimica de los tipos .... 456 Excepeiones ...... 437 Mixins ...... ce ASS Mixins en C++ 459 Mezelado de clases uiizando interfaces, 460 Contenido xiii Utilizaciin del patrin Decoradar 461 Mixins con proxies dinimicos. ...... 462 ‘Tipos latentes cose MO Compensacién de le carencia de tipos latentes. . 467 Reflexion 467 Aplicacion de un método uma seevencia ...... 468 {Qué pasa cuando no disponemos dela interfz ‘correcta? a7 ‘Simulacién de tpos latentes mediante adapradores472 Utilizando los objetos de funcion como cestratogis . i 474 Resumen: realmente es tan malo el ‘mecanismo de proyeccion?........-+.+--479 Lectura aiconales 481 16 Matrices .... +483 Por que las matrices son especiales ......... 483 Las matrices son objetos de primera clase... . 484 Devolucién de una matriz. 487 Matrices multidimensionales ... 488 Matrices y genéricos eee 491 Creacién de datos de prucha ....... 493 Arrays. 7 493 Generadores de datos 494 CCreacid de matrices partir de generadores .... 498 Utitidades para matrices. = 502 Copia en uma matriz son Comparacién de matrices... 303 Comparaciones de elementos de matriz S04 (Ordenaciém de una mattiz Sov Baisquedes en una matriz ordenada 08 Resumen... 509) 417 Andlisis detallado de los contenedores .... 513 Taxonomia complets de los contenedores ..... 513, Relleno de contenedores..... eesvawlsld Una soluciém basads en generador «........2..515 Generadores de mapas 3: 316 Ublizacién de clases abstactas cee S19 Funcionalidad de las eoleceiones 2 25 Cperaciones opeionales . = 528 ‘Operaciones no soportadas 2529 Funcionalidad de Lis ‘ i 030) Conjuntos y orden de almacenamient. 533 SortedSet. 5 i 336 Colas. : St xiv Piensa en Java Colas con prioridad sik Colas dobles 2589 Mapas -540 Remimiemto ee eeesceseveseseeveees SMD SortedMap. S44 LinkedHashMap. 545 Almacenamieit y ebdigoe hash + S45 Funcionamiento de hastiCodet ) 248 Mejoca dela velocidad con el almacenamiento hash $50 ‘Sustitucidn de hashCode)... 2583 Seleceién de una implementacién 22858 Un marco de trabajo para pruebas de rendimiento S58 ‘Seleecin entre listas aavenencecSBl Peligros asociados a las micropruebas de rendimiento $66 Seteecién de un tipo de eonjunto 567 Seleccén de un tipo de mapa 569 Utilidades . : -572 Cree aise in at 31s ‘Creacién de colecciones © mapas n0 modificables oe “316 Sincronizacién de una coleccién o.un mapa... 577 Almacenamiento de referencias . S78. ‘WeakHlashMtap. 580 Contenedores Java 1.0/1.1. - 581 Veotor y Enumeration .....2...2ccee cscs SBE Hashtable ‘Stack BiSet Resumen 18 Entradalsalida La clase File (Una utilidad para listados de directorio, . Litilidades de directorio Biisqueda y ereaci6n de directorios Entrada y salida oo... .ceeeeenee 596 pes de InputStream. -597 Tipos de OutputStream 598 Adicién de atributos e interfaces iitiles 598 ‘Lectura de un fTujo InputStream con FilterimputStream 599 Eseritura de un flujo OutputStream con FikerOutputStream... 2599 Lectores y escritores 600 Origenes y destinos de los datos “Modificacidn del comportamiento de fos fyjos de datos . (Clases no modificadas Random AccessFile Utilizacién tipica de los flujos de B/S . Archivo de entrada con buffer. Entrada desde memoria [Entrada de mestoria formateoda Salida bisica archivo ‘Almacenamiento y recuperacion de datos... Lectura y escrtura de archivos de aceeso aleatorio Fllujos de datos canalizados .... Utilidades de lectura y escritura de archivos Lectura de atchivos binarios E/S estindar . . Lectura de I entrada estindir Cambio de System.out aun objeto Print Writer. . Redireccionamiento de la E/S estindar Contro! de procesas Los paquetes new Conversiin de datos... Extracein de primitivas Buffers utilizados como vistas Manipulacién de datos eon duffors - Detalles acerea de los buffers Archivos mapeados en memoria Bloqueo de archivos Compresién Compcesin simple con GZ1P Alnacen de mutiples archivos com Zip. Archivos Java JAR) Serializacién de objetos Localizacién de la clase Control en In serializacin Utilizacidn deta persistencia.. XML Preferencias, . Resumen ...... 19 Tipos enumerados . Caracteristicas bisicas de las enumeraciones Utilizacidn de importacionesestiicas con las 601 601 602 632 <4 635 635 -67 «639 6a a2 649 654 656 + 658 659 660 20 Anotaciones . 21 Concurrencia....... -Adicin de métodos @ una coumeracion .. ‘Sustitueién de les métodos de una enumeracion ‘Enumeraciones on las instruceiones switeh El misterio de valwes() 6..0..00seeeees Implementa, no hereda Seleccidn ateatoria Uiiizacidn de interfaces con propdsitos de ‘organizacién .. — Urilizacién de EnumSet en lugar de indicadores iN Uiilizacién de EnumMap 22... Métodlos especifieos de constante. --661 662 662 663 665: 666 667 on 672 ona Cadena de responsabilidad en las enumeraciones. 676 Miiguinas de estado con enumeraciones . Despacho miltiple .......... (Como despachar con enumeraeiones Unilizacion de métodos espeeitions de eonstante (Cénno despachar con mapas EnumMap Utitizaciim de ma matriz 2D Resumen Sintaxis basica Definicida de anotaciones .. Meta-enotnciones ae Escritura de procesadores de anotaciones Elementos de anotaeién sue Restriceiones de valor predeterminado Genoracion de archives extemas Solucionesalterativas Las anotaciones no soportan la horencia Implementacién del procesador : Litilizacién de apt para procesar anotaciones Utilizacion del patron de disetio Visitante con apt _ Pruebas vnitarias basadas en anotaciones Lilizacion de @Unlt con genéticas No hee falta ningin “sgrupamierto™ Implementacién de @Unit Fliminacién del codigo de prucba Resumen . Las miiltiples caras de la concurrencia. jecucida mis ripida 630 = 686 688 690 = 690 691 = 693 64 68 695 696 ages 700 700 703 706 708 16 17 m7 7B rs 72 728 128 Contenido xv Mejora del diseio del eddigo Conceptos bisicos sobre hebras = DDefinietin de las tareas Laclase Thread Utilizacion de Executor Produceién de valores de retomo de fs reas Cémo dormir una tarea ... Prioridad. ‘Cesiém del control Hebras demonio. ‘Variaciones de codigo . Terminologia Absoreidn de wa hebra CCroacién ie interfaces de usuario de respuesta ripida Grupos de hebras ‘Capmura de excepeiones Comparticion de recursos. Acceso inapropiad a Jos recursos Resolucién de la eantienda por Tos recursos ccompartidos ‘Atomicidad y volaiidad (Clases atémicas Seeciones criticas Sineronizacion sobre otras objetos Almscenamieato local de as hebras ‘Terminacién de tareas El jain ornamental “Terminaciin durante el bioqueo Intesrupcin Comprobacin de laexisencia de una interrupsin Cooperacién entre tareas ‘waltO y notif¥ANO notify y notify A Productores y consumiores Productoes-consumidaresy eolas Uiilizacidn de canatizaciones para la B/S ene tareas Interblogquee Nuevos componentes de biblioteca ... ‘CountDownLateh. (CyelieBarrier 2 Delay(Quene PriortyBlockingQuewe 730 BI wi 732 24 736 BT 7S 740 740 ™ 143 788 750 751 751 733 TS 156 760 768 168 770 m7 772 m 8 76 782 784 784 788 1 196 xvi Piensa en Java El controlador de invernadeso implementado ‘Tableros con fics sormnarssecrellh ‘on ScheduledExecutor cB Recuadros de mensaje. 888 Semaphore ..... 817 Meni — 890 Exchanger. 820 Monin emergeates «0s scescseccee esses 8M Simulacion . —— = 821 Ditajo.. cscs ener is Simmulacion de un eajero .. teeeseeseeees ne B2L CCuadios de dislogo . semvianil Siomulacign de un restaurant ooo 826 CCundros de dislogo de archivos 901 Distrbuci de trabajo. 829 HTML en los componentes Swing «+....2+. 04-902 ‘Optimizacién del rendimiento ..........00+. 834 Deslizadore y baras de progreso 03 Comparacién de las tecoologias mutex. ........ 834 Seloocién del aspectoy del esl «esses 54 9 Cootenedores libres de bloguees....- 2+... 841 Arbotes tablas y postapapeles 906 Blogueo optimista ....... si s47 INLP y Java Web Start. ReadWriteLocks 848 Concurrencia y Swing. .. Objetos activos .... 850 ‘Tare de larga duraci6n 5... Resumen . Hlebrasvisuales .....eseeseeseeee 916 Lectura adicionales 0.00.2. ass Programacién visual y componentes JavaBean . 918 {Qué es un componente JavaBean? 919 22 Interfaces gréficasde usuario .............857 Senile ds thumedin Deatinh on Applets ee oo BSB Intospector . Fundamentos de Swing ...... £859 ‘Una Bean mas sofisticada . Un entomo de vsualizacin 861 Sineroniracidn en JavaBeans 927 Definicién de un boten 862 ‘Empaquetado de una Bean........ Captura de un SUCESO eee eevee +862 Soporte avanzado de componenies Bean Areas de texto... 864 Mais infarmucign sobre componentes Bean. Control de ta disposiciin ...... 865 Alternativas a Swing. coor ee 932 BorderLayout..... ; = 866 ‘Constraccién de clientes web Flash con Flex . 932 FlowLayout. 5... oa 2 867 Hello, Flex coceeenene BP GridLayout 867 ‘Compilacidn de MXML. 933 GriaBagLayout........ 868, MXML y ActonSeript.---.s--s ere eco rere 934 Posicionamientoabs0lito ....- 2.021011 +868 Contenedores y eontroes 935 BoxLayout.... cons 868 Efectos yestilos 936 Cua es la mejor solucISN?, esse eee 868 SHCESO8. ese ee hl El modelo de sucesos de Swing ..... 368 Conexién con JAVA... ees ces cesses eee 87 Tipos de sueesos y Ge e80UChI8 e050 9 869 “Modelo de datos y scoplamiento de datos......939 Control de miltiples sucesos 874 CConstruccién eimplantacion de aplicaciones -...940 Una seleccion de componentes Swing ....... 876 Creacién de aplicaciones SWT oat Botones 3 876 Instalacién de SWT 94 Teonos 3 878 Hello, SWT ot Sugerencias seuss 880 liminacidn de edigo vedundante- 948 Campos de text0 eee ceeee 880 Meni 945 Bordes KiceactesieecrrensoeSEEL Panels con fichas, botomes y sucesns evens... 946 Un mini-editor. $82 Graficos... a 949 (Casillas de veriicacibm 6... cose eevee 883 Concurrencia en SWE... 980 Botones de opeidn : 384 {SWT 0 Swing? 982 ‘Cuadros combinados (lists desplegables) 885 Resumen... fe 952 (Cundros de ist... tee oo 886 Recursos 983 Contenido xvil ‘A Suplementos . a 955 B Recursos . eee ee Suplementos descargables ......e4eses0+00 955 Software oe ce 959 Thinking in C: fundamentos para Java 955 E2ditores ¥ entornos IDE 939 Seminario Thinking in Java. . 95 LLbEOS «es ceseeneese 2959 Seminario CD Hands-On Java... +2 .21+++ +4956 Anise y 0 5. cs. casseesseee sees 960 Seminario Thinking in Objects. +956 Python se ceeeeeves eee 962 Thinking in Enterprise ava 936 Mi propia ist de ibeos 962 Thinking in Patterns (con Java). 957 Indice .. 963 Seminario Thinking in Pamerns . 2937 Consultoria y revision de diseilo . 937 Introduccion “El dio al hombre la capacidad de hablar, y de esa capacidad surgié el pensamiento. Que es la medida del Universo” Prometeo desencadenado, Shelley Los seres humanos ... estamos, en buena medida, a merced det lenguaje concreto que nuestra sociedad haya elegido como medio de expresién. Resulta completamente tlusorio creer que nos qjustamos a la realidad esencialmente sin uitizar el lenguaje y que el lenguaje es meranrente un medio incidental de resolver problemas especificos de comumicacién v reflexién. Lo cierto es que el “mundo real” esté en gran parte canstruido, de manera inconsciemte, sobre las hibi- 10s lingitsticas del grupo. Etestado de la Lingitstica como clencia, 1929, Edward Sapir Como cualquier lenguaje humano, Java proporciona una forma de expresar conceptos. Si tiene éxito, esta forma de expre- sién serd significativamente mas facil y flexible que las alternativas a medida que los problemas erecen en tamafio y en com- plejidad No podemos ver Java s6lo como una coleceién de caracteristicas, ya que algunas de ellas no tienen sentido aisladas. Slo se puede emplear la stma de las partes si se est pensando en el disefio y no simplemente en la codificacién. Y para enten- der Java asi, hay que comprender los problemas del lenguaje y de la programacién en general. Este libro se ocupa de los problemas de la programacién, porque son problemas, y del método que emplea Java para resolverlos. En consecuencia, el conjunto de caraeteristicas que el autor explica en cada capitulo se basa en la forma en que ¢! ve e6mo puede resolverse un tipo de problema en particular con este lenguaje. De este modo, el autor pretende condueir, poco a poco, al lector hasta el Punto en que Java se convierta en su lengua materna, La acttud del autor a lo largo de! libro es la de conseguir que el lector construya un modelo mental que le permita desarro- lar un conocimiento profundo del lenguaje; si se enfrenta a un puzzle, podri fijarse en el modelo para tratar de deducir la respuesta. Prerrequisitos Este libro supone que el lector esté familiarizado con Ia programacién: sabe que un programa es una coleceién de instruc ciones, qué es una subrutina, una fimeién o una macro, conoce las instrucciones de control como “if” y las estructuras de bucle como “while”, ete. Sin embargo, es posible que el lector haya aprendido estos conceptos en muchos sitios, tales camo Ja programacién con un lenguaje de macros o trabajando con una herramienta como Perl. Cuando programe sintiéndose ‘cémodo con las ideas basicas de la programacién, podra abordar este libro, Por supuesto, el libro serd mes fic para los pro- sgramadores de C y mas todavia para los de C++, pero tampoco debe autoexcluirse si no tiene experiencia con estos lengua- Jes (aunque tendra que trabajar duro). Puede descargarse en www. MindView:net el seminario multimedia Thinking in C, el ‘cual le ayudari a aprender mAs rapidamente los fundamentos necesarios para estudiar Java. No obstante, en el libro se abor- an los conceptos de programacién orientada a objetos (POO) y los mecanismos de control bisicos de Java, Aunque a menudo se hacen referencias a las caracteristicas de los lenguajes C y C++ no es necesario profundizar en ellos, aunque si ayudaran a todos los programadores a poner a Java en perspeciiva con respecto a dichos lenguajes, de los que al fin y al cabo desciende. Se ha intentado que estas referencias sean simples y sirvan para explicar cualquier cosa con la que ‘una persona que nunca haya programado en C/C:+ no esté familiarizado, xxvi Piensa en Java Aprendiendo Java Casi al mismo tiempo que se publicé mi primer libro, Using C++ (Osbomne/MeGraw-Hill, 1989), comencé a ensefiar dicho lenguaje. Ensefiar lenguajes de programacién se convirtié en mi profesién; desde 1987 he visto en auditorios de todo el mundo ver dudar a Jos asistentes, he visto asimismo caras sorprendidas y expresiones de incredulidad. Cuando empecé a impart cursos de formacién a grupos pequeflos, descubri algo mientras se hacfan ejervicios. Incluso aquellos que sonrefan se quedaban con dudas sobre muchos aspectos. Comprendi al dirigir durante una serie de alos la sesién de C++ en Ia Software Development Conference (y mas tarde la sesion sobre Java), que tanto yo como otros oradores tocdbamos dema- siados temas muy répidamente, Por ello, tanto debido a la variedad en el nivel de la audiencia como a la forma de presen- tar el material, se termina perdiendo audiencia. Quiza es pedir demasiado pero dado que soy uno de esos que se resisten a tas conferencias tradicionales (y en la mayoria de los casos, creo que esa resistencia proviene del aburrimiento), queria inten- tar algo que permitiera tener a todo el mundo enganchadbo. Durante algtin tiempo, creé varias presentaciones diferentes en poco tiempo, por lo que terminé aprendiendo segiin el méto- do de la experimentacién ¢ iteracién (una téenica que también funciona en el disefto de programas). Desarrollé umn curso uti- lizando todo lo que habia aprendido de mi experiencia en la ensefianza, Mi empresa, MindView, Inc., ahora imparte el seminario Thinking in Java (piensa en Java); que es nuestro principal seminario de introducci‘n que proporciona los funda- ‘mentos para nuestros restantes seminarios més avanzados, Puede encontrar informacién detallada en ww:MindViewinet. EL seminario de introduccién también esta disponible en el CD-ROM Hands-On Java, La informacién se encuentra disponible en el mismo sitio web. a respuesta que voy obteniendo en cada seminario me ayuda a cambiar y reenfocar cl material hasta que creo que funcio- na bien como método de ensefanza. Pero este libro no son s6lo las notas del seminario; he intentado recopilar ef maximo de informacién posible en estas paginas y estructurarla de manera que cada tema lieve al siguiente. Més que cualquier otra ‘cosa, el libro esti disefiado para servir al lector solitario que se esté entrentando a un nuevo lenguaje de programacién, Objetivos Como mi anterior libro, Thinking in C++, este libro se ha disefado con una idea en mente: la forma en que las personas aprenden un lenguaje. Cuando pienso en un capitulo del libro, pienso en términos de qué hizo que Fuera una levcién duran- te un seminatio. La informacién que me proporcionan las personas que asisten a un seminario me ayuda a comprender cud- Jes son las partes complicadas que precisan una mayor explicacién, En las reas et las que fui ambicioso ¢ inclui demasiadas caracteristicas @ un mismo tiempo, pude comprobar que si incluia muchas earacteristicas nuevas, tenia que explicarlas y eso contribuia ficilmente a la confusion del estudiante En cada capitulo he intentado ensefiar una sola caracteristica 0 un pequefio grupo de caracteristcas asociadas, sin que scan necesarios conceptos que todavia no se hayan presentado. De esta manera, cl lector puede asimilar cada pieza en el contex- to de sus actuales conocimientos. Mis objetivos en este libro son los siguientes: 1. Presentar el material paso a paso de modo que cada idea pueda entenderse ficilmente antes de pasar a Ia siguien- te. Secuenciar cuidadosamente la presentacién de las caracteristicas, de modo que se haya explicado antes de que se Vea en un ejemplo. Por supuesto, esto no siempre es posible, por lo que en dichas situaciones, se proporeiona una breve descripcién introductoria, 2. Utilizar ejemplos que sean tan simples y corios como sea posible, Esto evita en ocasiones acometer problemas del “mundo real”, pero he descubierto que los principiantes suelen estar mis contentes cuando pueden compren- der todos los detalles de un ejemplo que cuando se ven impresionados por el imbito del problema que restelve. También, existe una seria limitacién en cuanto a la cantidad de cédigo que se puede absorber en el aula. Por esta razén, no dudaré en recibir criticas acerca del uso de “ejemplos de juguete”, sino que estoy deseando recibirlas cn aras de lograr algo pedagogicamente itil. 3. Dar Jo que yo creo que es importante para que se comprenda el lenguaje, en lugar de contar todo lo que yo sé. Pienso que hay una jerarquia de importancia de la informacién y que existen hechos que el 95% de los progra- madores nunca conocerén, detalles que s6lo sirven para confundir a las personas y que incrementan su percep cidn de la complejidad del lenguaje. Tomemos un ejemplo de C, si se memoriza la tabla de precedencia de los Introduccion xxvil operadores (yo nunca lo he hecho), se puede escribir cédigo inteligente, Pero si se piensa en ello, también con- fundiré la lectura y el mantenimiento de dicho eddigo, por tanto, hay que olvidarse de la precedencia y emplear paréntesis cuando las cosas no estén claras. 4. Mantener cada seccién enfocada de manera que el tiempo de lectura y el tiempo entre ejercicios, sea pequetio. Esto no solo mantiene las mentes de los alumnos mas activas cuando se esti en un seminario, sino que también proporciona al lector una mayor sensacion de estar avanzando. 5. Proporcionar al alumno una base sélida de modo que pueda comprender los temas los suficientemente bien como para que dese acudir a cursos 0 libros mas avanzados. Ensefiar con este libro La edicién original de este libro ha evolucionado a partir de un seminario de una semana que era, cuando Java se encontra- ba en su infancia, suficiente tiempo para cubrir el lenguaje. A medida que Java fue ereciendo y afiadiendo més y més fun cionalidades y bibliotecas, yo tenazmente trataba de ensefiarlo todo en tmna semana, En tna ocasién, um cliente me sugirié que ensefiara “sélo los fundamentos” y al hacerlo deseubrf que tratar de memorizar todo en una iinica semana era angustio- 50 tanto para mi como para las personas que asistian al seminario. Java ya no era-un lenguaje “simple” que se podia apren- der en una semana. Dicha experiencia me Ievé a teorganizar este libro, el cual ahora esté disefiado como material de apoyo para un seminario de dos semanas 0 un curso escolar de dos trimestres. La parte de introduccién termina con el Capitulo 12, Tratamiento de errores mediante excepciones, aunque también puede complementarla con una introduccién a IDBC, Servlets y JSP. Esto proporciona las bases y es el nicleo del CD-ROM Hands-On Java, El resto del libro se corresponde con un curso de nivel intermedio y es el material cubierto en el CD-ROM Intermediate Thinking in Java. Ambos discos CD ROM pueden adqui- rirse a través de www. MindView.net. Contacte con Prentice-Hall en wunn,prenhallprofessional.com para obtener més informacién acerca del material para el pro- fesor relacionado con este libro. Documentacion del JDK en HTML El lenguaje Java y las bibliotecas de Sun Microsystems (descarga gratuita en http:/java.sun.com) se suministran con docu ‘mentacién en formato clectrOnico, que se puede leer con un explorador web. Muchos de los libros publicados sobre Java proporcionan esta documentacién, Por tanto, 0 ya se tiene o puede descargase y, a menos que sea necesario, en este libro no se incluye dicha documentaciéa, porque normalmente es mucho mas répido encontrar las descripciones de las clases en el explorador web que buscarlas en un libro (y probablemente la documentacién en linea estard més actualizada). Basta con que utilice la referencia “JDK documentation”, En este libro se proporcionan descripciones adicionales de las clases s6lo ‘cuando es necesatio complementar dicha documentacién, con el fin de que se pueda comprender un determinado ejemplo. Ejercicios He descubierto que durante las clases los ejercicios sencillos son excepcionalmente titiles para que el alumno termine de comprender el tema, por lo que he incluido al final de cada capitulo una serie de ejercicios. ‘La mayor parte de los cjercicios son bastante sencillos y estan diseiiados para que se puedan realizar durante un tiempo razo- rable de la clase, mientras el profesor observa los progresos, asegurdndose de que los estudiantes aprenden el tema. Algunos son algo més complejos, pero ninguno presenta un reto inalcanzable. Las soluciones a los ejercicios seleccionados se pueden encontrar en el documento electrinico The Thinking in Java Annotated Solution Guide, que se puede adquirir en www: MindView.net. Fundamentos para Java tra ventaja que presenta esta edicién es el seminario multimedia gratuito que puede descargarse en la direccién wovnn MindView.net. Se trata del seminario Thinking in C, el cual proporciona tna introduecién a los operadores, funciones xxviii Piensa en Java y Ia sintaxis de C en Ia que se basa la sintaxis de Java. En las ediciones anteriores del libro se encontraba en el CD Foundations for Java que se proporcionaba junto con el libro, pero ahora este seminario puede descargarse gratuitamente. Originalmente, encargué a Chuck Allison que creara Thinking in C como un producto auténomo, pero decid! ineluirlo en la segunda edicién de Thinking in C++ y en la segunda y tercera ediciones de Thinking in Java, por la experiencia de haber ‘estado con personas que llegan @ los seminarios sin tener una adecuada formacion en la sintaxis basica de C. El razonamien- {to suele ser: “Soy un programador inteligente y no quiero aprender C, sino C+ 0 Java, por tanto, me salto el Cy paso direc- tamente a ver el C++/Java", Después de asisti al seminario, lentamente todo el mundo se da cuenta de que el prerrequisito de conocer la sintaxis de C tiene sus buenas razones de ser. ‘Las tecnologias han cambiado y han permitido rehacer Thinking in C como una presentacién Flash descargable en lugar de tener que proporcionarle en CD. Al proporcionar este seminario en linea, puedo garantizar que todo ef mundo pueda comen- zar con una adecuada preparacién. El seminario Thinking in C también permite atraer hacia el libro a una audiencia importante. Incluso aunque los capitulos ddedicados a operadores y al control de la ejecucién cubren las partes fundamentales de Java que proceden de C, el semina- rio en Tinea es una buena introduceién y precisa del estudiante menos conocimientos previos sobre programacién que este libro. Cédigo fuente Todo el e6digo fuente de este libro esté disponible gratuitamente y sometido a copyright, distribuido como un paquete dnico, visitando el sitio web www. MindView:net. Para asegurarse de que obtiene la versin més actual, éste es el sitio oficial de dis- tribucién del cédigo, Puede distribuir el cédigo en las clases y en cualquier otra situacién educativa. FI objetivo principal del copyright es asegurar que el cédigo fuente se cite apropiadamente y evitar asi que otros lo publi- quen sin permiso. No obstante, mientras se cite la fuente, no constituye ningiin problema en la mayoria de los medios que se empleen los ejemplos del libro. En cada archivo de codigo fuente se encontrar una referencia a la siguiente nota de copyright: /1:4 Copyright. txt ‘This computer source code ie Copyright ©2006 MindView, Inc. All Rights Reserved. Permission to use, copy, modify, and distribute this computer source code (Source Code) and its docunentation without fee and without a written agreement for the purposes set forth below is hereby granted, provided that the above copyright notice, this paragraph and the following five numbered paragraphs appear in all copies. 1. Permission is granted to compile the Source Code and to include the compiled code, in executable format only, in personal and conmercial software programs. 2. Permission is granted to use the Source Code without modification in classroom situations, including in presentation materials, provided that the book "Thinking in Java" is cited as the origin. 3. Permission to incorporate the Source Code into printed media may be obtained by contacting: Mindview, Inc. 5343 Valle Vista La Mesa, California 91941 Wayne@NindView.net 4. The Source code and documentation are copyrighted by MindView, Inc. The Source code is provided without express Introduccién xxix or implied warranty of any kind, including any implied warranty of merchantability, fitness for a particular purpose or non-infringement. MindView, Inc. does not warrant that the operation of any program that includes the Source Code will be uninte- rrupted or ezror-free. MindView, Inc. makes no representation about the suitability of the Source Code or of any software that includes the Source code for any purpose. The entire risk as to the quality and performance of any program that includes the Source Code is with the user of the Source Code. The user understands that the Source Code was developed for research and instructional purposes and is advised not to rely exclusively for any reason on the Source Code or any program that includes the Source Code. should the Source Code or any resulting software prove defective, the user asoumes the cost of all necessary servicing, repair, or 5_ TW No EVENT SHALL MINDVIEW, INC., OR ITS PUBLISHER BE LIABLE TO ANY PARTY UNDER ANY LEGAL THEORY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DANAGES, INCLUDING LOST PROFITS, BUSINESS INTERRUPTION, LOSS OP BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS, OR FOR PERSONAL INJURIES, ARISING OUT OF THE USE OF THIS SOURCE CODE AND ITS NOCUMBNTATION, OR ARISING OUT OF THE INABILITY TO USE ANY RESULTING PROGRAM, EVEN IF MINDVIEW, INC., OR ITS PUBLISHER HAS BEEN ADVISED OP THE POSSIBILITY OF SUCH DAMAGE. MINDVIEW, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, SUT NOT LIMITED TO, THE TMPLTED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOURCE CODE AND DOCUMENTATION PROVIDED HEREUNDER IS ON AN "AS IS” BASIS, WITHCUT ANY ACCOMPANYING SERVICES FROM MINDVIEW, INC., AND MINDVIEW, INC. HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. Please note that MindView, Inc. maintains a Web site which is the sole distribution point for electronic copies of the source Code, http: //www.MindView.net (and official mirror sites), where it is freely available under the terms stated ahove. If you think you've found an exror in the Source code, please submit a correction using the feedback system that you will find at http: //wwy.Mindview.net. Whew Puede utilizar el cédigo en sus proyectos y en Ia clase (incluyendo su material de presentaciones) siempre y cuando se man- tenga la nota de copyright en cada uno de los archivos fuente. Estandares de codificacion En el texto de! libro, los identificadores (nombres de métodos, variables y clases) se escriben en negrita. La mayoria de las palabras clave se escriben en negrita, excepto aquellas palabras clave que se usan con mucha frecuencia y ponerlas en negri- ta podria voiverse tediaso, como en el caso de Ia palabra “class” En este libro, he utilizado un estilo de codificacién particular para los ejemplos. Este estilo sigue el que emplea Sun en prac- ticamente todo el e6digo que encontrar’ en su sitio (véase hp. /ijava.sun.com/docs/eodeconv/index. html), Y que parece que soporta la mayoria de los entomos de desarrollo Java. Si ha leido mis otros libros, observard también que el estilo de codi- ficacién de Sun coincide con el mio, lo que me complace, ya que yo no tengo nada que ver con la creacién del estilo de vox Piensa en Java Suin, El tema del estilo de formato es bueno para conseguir horas de intenso debate, por lo que no voy a intentar dictar un estilo correcto a través de mis ejemplos; tengo mis propias motivaciones para usar e! estilo que uso, Dado que Java es un lenguaje de programacién de formato libre, se puede emplear el estilo con el que uno se encuentre a gusto. Una solucién para el tema del estilo de codificacién consiste en utilizar una herramienta como Jalopy (www.triemat.com), la cual me ha ayudado en el desarrollo de este libro cambiar el formato al que se adaptaba a mi. _Los archivos de cédiyo impresos ene! libro se han probado con un sistema automatizado, por lo que deberian ejecutarse sin cerrores de compilacién. Este libro est basado y se ha comprabado con Java SES/6. Si necesita obtener informacién sobre versiones anteriores del lenguaje que no se cubren en esta edicién, In ediciones primera y tercera del mismo pueden deseargarse gratuitamente en worn Mind Viewnet, Errores No importa cuantas herramientas utilice un eseritor para detectar los errores, algunos quedan ahi y a menuclo son lo que pri- ‘mero ve el lector. Si descubre cualquicr cosa que piensa que es un error, por favor utilice el vinculo que encontrar para este libro en www: MindView:net y envieme el error junto con la correccién que usted crea. Cualquier ayuda siempre es bienve- nia. Introduccién a los objetos “Analizamos la Naturaleza, la organizamos en conceptos y vamos asignando significados a medida que lo hacemos, fundamentalmente porque participamos en un acuerdo técito suscrito por toda nuestra comunidad de hablantes y que esta codificado en los propios patrones de nues- tro idioma... nos resulta imposible hablar si no utilizamos la organizacién y clasificacién de los datos decretadas por ese acuerdo” Benjamin Lee Whort (1897-1941) La génesis de la revolucién de las computadoras se hallaba en wna maquina. La génesis de nuestros lenguajes de programa- cidn tiende entonces a parecerse a dicha maquina, Pero las compuitadoras, mas que maquinas, pueden considerarse como herramientas que permiten ampliar la mente (“bici- cletas para In mente”, como se enorgullece en decir Steve Jobs), ademas de un medio de expresién diferente. Como resul- tado, las herramicntas empiezan a parecerse menos a miquinas y mas a partes de nuestras monies, al igual que ocurre con otras formas de expresién como la escritura, Ia pintura, la escultura, la animacién y la realizaci6n de peliculas. La progra- rmacién orientads @ objetos (POO) es parte de este movimiento dirigido al uso de las computadoras como tun medio de expre= sin Este capitulo present los concepios basicos de la programacion orientada a objets, incluyendo una introduccién a los méto- dos de desarrollo. Este capitulo, y est libro, supone que e! lector tiene cicrta experiencia en programacién, aunque no nece- sariamente en C. Si cree que necesita una mayor preparacién antes de abordar este libro, deberia trabajar con el seminario ‘multimedin sobre C, Thinking in C, que puede descargarse en wwv:MindView.ner. Este capitulo contiene material de caricter general y suplementario, Muchas personas pueden no sentirse eémodas si se cnffentan a la programacién orietada a objetos sin obtener primero une visi general. Por tanto, aqui se presentan muchos conceptos que proporcionan una sida infroduecion ala POO. Sin embargo, otra personas pueden no necesitar tener una visign general hasta haber visto algunos de los mecanismos primero, estas personas suelen perderse si no se les offece algo de eddigo que puedan manipular. Si usted forma parte de este itimo grupo, estara ansioso par ver las especifidades del len- guaje, por lo que puede saltase este capitulo, esto no le impediré aprender a eseribir programas ni conocer el lenguaje. Sin embargo, pod volver aqui cuzando lo necesite para completar sus conocimientos, con el fin de comprender por qué Son importantes los objetos y emo puede disefarse eon ellos El progreso de la abstraccion Todos los lenguajes de programacién proporcionan abstracciones. Puede argumentarse que lz complejidad de los problemas ‘que sea capaz de resolver est directamente relacionadia com cl tipo (clase) y ln calidad de las abstracciones, entendiendo por “clase”, “jqué es lo que se va a abstraer?”. El lenguaje ensamblador es una pequefa abstraceién de la méquina subyacente. Muchos de 10s lenguajes denominados “impetativos” que le siguicron (como FORTRAN, BASIC y C) fueron abstraccio- res del lenguaje ensamblador. Estos lengusjes constitayen grandes mejoras sobre el lenguaje ensamblador, pero su princi- pal abstraccién requiere que se piense en términos de la estructura de la computaclora en lugar de en la estructura del problema que se esté intentado resolver. El programador debe establecer la asociacién entre el modelo de la maquina (en el “espacio de la solucién”, que es donde se va a implementar dicha solucidn, como puede ser una eomputadora) y el modelo 2 Pionsa en Java del problema que es lo que realmente se quiere resolver (en el “espacio del problema”, que es el lugar donde existe el pro- blema, como por ejemplo en un negocio). El esfuerzo que se requiere para establecer esta correspondencia y el hecho de aque sea extrinseco al lenguaje de programacién, da lugar a programas que son dificiles de escribir y earos de mantener, ade- iis del efecto colateral de toda una industria de “mtodos de programacién”. La altemativa a modelar la maquina es modelar el problema que se esté intemtado solucionar, Los primeros lenguajes como LISP y APL cligen vistas parciales del mundo (“todos los problemas pueden reducirse a listas” 0 “todos los problemas son algoritmicos”, respectivamente). Prolog convierte todos los problemas en eadenas de decisién. Los lenguajes se han creado para programar basindose en restriciones y para programar de forma exclusiva manipulando simbolos grificos (aunque se demostrd que este caso era demasiado restrictivo). Cada uno de estos méiodos puede ser una buena solucién para resolver la clase de problema concreto para el que estén diseiiados, pero cuando se aplican en otro dominio resultan inadecuades. El enfoque orientado a objetos trata de ir un paso més alla proporcionando herramientas al programador para representar los elementos en el espacio del problema. Esta representacién es tan gencral que el programador no esta restringido a ningiin tipo de problema en particular. Se haee referencia alos clemnentos en el espacio del problema denominando “objetos” a sus representaciones en el espacio de la solucion (tambien se necesitarin otros objetos que no tendrin andlogos en el espacio del problema), La idea es que el programa pueda adaptarse por si slo a la jerga del problema afadiendo nuevos tipes de dbjetos, de modo que cuando se lea el eédigo que describe la solucién, se estén leyendo palabras que también expresen el problema, Esta es una abstraccién del lenguaje mds flexible y potente que cualquiera de las que se hayan hecho anterior- mente!. Por tanto, la programacién orientada a objetos permite describir el problema en términos del problema en lugar de ‘en términos de Ia computadora en a que se ejecutard la solucién, Pero ain existe una conexién con Ia computadora, ya que cada objeto es similar a una pequefia computadora (tiene un estado y dispone de operaciones que el programador puede pedile que reaice). Sin embargo, esto no quiere decir que nos encontremos ante una mala analogia de los objetos del mundo real, que tienen caracteristicas y comportamientos. ‘Allan Kay resumié las cinco caracteristicas bsicas del Smalltalk, el primer lenguaje orientado a objetos que tuva éxito y uno de los lenguajes en los que se basa Java. Estas caracteristicas representan un enfoque puro de Ia programacién orientada objotos. 1, ‘Todo es un objeto, Piense en un objeto como en una variable: almacens datos, permite que se fe “planteen soli- citudes”, pidiéndole que realice operaciones sobre si mismo. En teoria, puede tomarse cualquicr componente con= ceptual del problema que se esta intentado resolver (perros, edificios, servicios, ee.) y representarse como un objeto det programs. 2. Un programa es un montén de objetos que se dicen entre sito que tienen que hacer envikindose mensajes. Para hacer una solicitud a un objeto, hay que enviar un mensaje a dicho objeto. Mas concretamente, puede pen sar en que un mensaje ¢s una solicitud para llamar a un método que pertenece a un determinado objeto. 3. Cada objeto tiene su propia memoria formada por otros objetos. Dicho de otra manera, puede erear una nueva ase de objeto definiendo um paquete que contengn objetos existentes. Por tanto, se puede incrementar la comple- 3d de un programa ocultindola tras la simplicidad de los objetos. 4. Todo objeto tiene un tipo asoeiado. Como se dice popularmente, cada objeto es una Insiancia de una clase, sien- do “clase” sindnimo de “tipo”. La caractetistica distintiva mas importante de una clase es “el conjunto de men- sajes que se le pueden enviar”, ‘5. Todos los objetos de un tipo particular pueden recibir los mismos mensajes. Como veremos més adelante, sta afirmacidn es realmente importante. Puesto que un objeto de tipo “circulo” también es un objeto de tipo “forma, puede garantizarse que un circulo aceptaré los mensajes de forma. Esto quiere decir que se puede eseri- bir eédizo para comunicarse con objetos de tipo forma y controlar autométicamente cualquier cosa que se ajuste ‘a Indeseripeidn de una forma. Esta capacidad de suplantacién es tno de los conceptos mas importantes de la pro- ‘gramacién orientada a objetos. Booch ofrece una deseripeidn ain mis sucinta de objeto: "algunos dieters de lnyuaes han decide que la prograacio oictada » objeos por si misma mo ex adecuada pare resolves fclmente todos Jo problemas de la programacién, y recomiendan combina varios mds en longnajes Se propramacion muldnaradigme. Consulte Mulporadin: Programming i Lea Je Voth Bud (Addison-Wesley, 1995) 1. Iniroduccién a los objeios 3 Un objeto tiene estado, comportamiento ¢ identidad, Esto significa que un objeto puede tener datos internos (lo que le proporciona ¢) estado), métodos (para proporeionar un ‘comportamicnto) y que cada objeto puede ser diferenciado de forma univoca de cualquier otro objeto; es decir, cada objeto tiene una direceién de memoria exclusiva? Todo objeto tiene una interfaz Aristateles fue probablemente cl primero en estudiar cuidadosamente el concepto de tipo; hablaba de “la clase de peces y de la clase de pjaros”. Le idea de que todos los objetos, ain siendo tinieos, son también parte de una clase de objetos que tienen caracteristicas y comportamientos comunes ya se emples en el primer lenguaje orientado a objetos, el Simula-67, que ‘ya usaba su palabra clave fundamental class, que permite introducir un niuevo tipo en wn programa, Simula, como su nombre implica, se cred para desarrollar simulaciones como la clisiva del “problem del cajero de un ‘banco”. En esta simulacién, se tienen muchos cajeros, clientes, cuentas, transacciones y unidades monetarias, muchisimos “objetos”. Los objetos, que son idénticos excepto por su estado durante la ejecucién de un programa, se agrupan en “clnses de objetos”, que es de donde procede la palabra clave elass. La creaeidn de tipos de datos abstractos (clases) es un concep- ‘to fundamental en la programacién orientada a objetos. Los tipos de datos abstractos funciona casi exactamente como tipos predefinidos: pueden crearse variables de un tipo (lamadas odjetos w instarcias en la jerga de la POO) y manipular dichas ‘variables (mediante el envio de mensajes 0 solicitudes, se envia un mensaje y el objeto sabe lo que tiene que hacer con él). {Los miembros (elementos) de cada clase comparten algunos rasgos comunes. Cada cuenta tiene asociado un saldo, cada caje- ro puede aceptar un deposito, etc. Ademis, cada miembro tiene su propio estado. Cada cuenta tiene un saldo diferente y cada cajera tiene un nombre. Por tanto, los cajeros, elientes, cuentas, transacciones, ete, pueden representarse-mediante una enti- dad nivoea en el programa informatica. Esta entcad es el objeto y cada objeto pertenece a una determinada clase que defi- ne sus caracteristicas y comportamientos. Por tanto, aunque en fs programacién orientada a objeios lo que realmente se hace es crear nuevos tipos de datos, en la pri tea, todos los lenguajes de programacién orientada a objetos utilizan la palabra clave “class”. Cuando vea la palabra “type (ipo) piense en “class” (clase), y viceversa.? Dado que una clase deseribe un conjunto de objetos que tienen caracteristicas (elementos de datos) y comportamientos (Ft cionalidad) idénticos, una clase realmente es un tipo de datos porque, por ejemplo, un niimero en coma flotante tambien tiene un conjunto de caraeteristicas y comportamientos. La diferencia esti en que el programador define un clase para adap- tar un problema en lugar de forzarel uso de un tipo de datos exisente que fe disehado para representar una umidad de alma- Cenamiento en una méquina. Se puede ampliar el lenguaje de programacisn aiiadiendo nuevos tipos de datos especificos que se adapten a sus necesidades, El sistema de programacién admite las nuevas clases ¥ proporciona a todas ellas las compro~ baciones de tipo que proporciona a los tipes predefinidos El enfoque orientado a objetos no esti Himitado a Ia creacién de simalaciones. Se esté 0 no de acuerdo on que cualquier pro- gama es una simulacién del sistema que se esti diseftando, el uso de las téenicas de ta POO puede reduc ficilente un ‘gran conjunto de problemas a una sencilla solucién, Una vex que se ha definido una elase, se pueden etea® tantos objetos de dicha clase como se desee y dichos objetos pueden manipularse como si fueran los elementos del problema que se esté intentado resolver. Realmente, uno de los retos de la programacién orientada a objetos es crear una comespondencia uno-a-uno entre los elementos del espacio del problema y los objetos del espacio de la solucion. Pero, ;cémo se consigue que un objeto haga un trabajo itil para el programador? Debe haber una forma de hacer una soli- citud al objeto para que haga algo, como por ejemplo, completar una transaccién, dibujar algo en pantalla o encendr un interruptor. Ademis, cada objeto sélo puede satisfacer ciertas solicitudes, Las solicitudes que se pueden hacer a un objeto se definen mediante su interfaz yes el tipo lo que determina la interfiz. Veamos un ejemplo con Ia representacion de una bombilla: > Realment, eso x poco restrict, ya que aden exis objeton en diferentes mayuina y expacios de dreciones,y también se pc mace co sca En estos casos, debe determinarse la idemtidad de ebjeto meant alguns otra cosa quel direcin de meme > Algucas personas tacen wa distinc, estaleciendo que el tipo determina I intr mientras quel clase os una implemcotacionconcresa de dich meri. 4 Pionsa on Java Tipo. Luz loncendert) Itertaz japagar() lbritart) latenuart) tug Iz = now tua(}s Tz-encendes () La interfixz determina las solicitudes que se pueden hacer a un determinado objeto, por lo que debe existir un c6digo en algu- na parte que satisfaga dicha solicitud, Esto, junto con los datos ocultos, definen lo que denomina Ia implementacién. Desde cl punto de vista de la programacién procedimental, esto no es complicado. Un tipo tiene un método asoeiado con cada posi- ble solieitud; cuando se hace una determinada solicited a un objeto, se lama a dicho métoda. Fste proceso se resume dicien- ddo que el programador “envia un mensaje” (hace une solicitud) a un objeto y el objeto sabe lo que tiene que hacer von ese ‘mensaje (ejecuta el cédigo). En este ejemplo, el nombre del tipo/clase es Luz, el nombre de este objeto concreto Luz es Izy las solicitudes que se pc den hacer @ un objeto Luz son encender, apagar, brllar 0 atenuar. Se ha creado un objeto Luz definiendo una “referencia” (2) para dicho objeto e invocando new para hacer una solicitud a un nuevo objeto de dicho tipo, Para enviar un mensaje al objeto, se define el nombre del objeto y se relaciona com la solicitud de! mensaje mediante un punto, Desde el punto de vista del usuario de una clase predefinida, esta es el no va mis de la programacién con objetos. BI diagrama anterior sigue el formato del lenguaje UML (Unified Modeling Language, lenguaje de modelado unificado). Cada elase se representa mediante un recuadro escribiendo ef nombre del tipo en ta parte superior, los miembros de datas en la zona intermedia y tos métodos (las funciones de dicho objeto que reciben cualquier mensaje que el programador envie a dicho objeto) en la parte inferior. A menudo, en estos diagrames s6lo se mucstran el nombre de la clase y las métodos piblicos, no ineluyéndiose la 2ona intermedia, como cn este caso. Si sélo se esti interesado en el nombre de fa clase, tam- [poco es niecesario incluir la parte inferior. Un objeto proporciona servicios Cuando se estéintentando desarrellar 0 comprender el diseRo de un programa, una de las mejores formas de pensar en los objetos es como si fueran “proveedores de servicios”. El programa proporciona servicios al usuario y esto se conseguir uti- lizando los servicios que ofrecen otros objetos. El objetivo es produc (0 incluso mejor, localizar en las bibliotecas de cédi- 0 existentes) un eonjunto de objctos que facilite los servicios idncos para resolver el problema. ‘Una manera de empezar a hacer esto es preguntindose: “Si pudiera sacarlos de un sombrero magico, zqué objets resolve rian el problema ce la forma més simple?”. Por ejemplo, suponga que quiere escribir un programa de contabilidad. Puede pensar en algunos objetos que contengan pantallas predefinidas para la inttoduccidn de los datos contables, otto coaj unto de objetos que realicen los eéleulos neeesarios y un objeto que controle Ia impresién de los cheques y Ias facturas en toda clase de impresoras. Fs posible que algunos de estos objetos ya existan, pero ,edmo deben ser los que no existen’? gQué ser- vicios deberian proporcionar esos objetos y qué objetos necesitarfan para cumplir con sus obligaciones? Si se hace este plan- teamiento, legard a un punto donde puede decir: “Este objeto es lo suficientemente scncillo como para escribirio yo mismo” 0 “Estoy seguro de que este objeto ya tiene que existr”. Esta es una forma razonable de descomponer tn problema en tn conjunto de objetos. Pensar en un objeto como en un proveedor de servicios tiene una ventaja adicional: ayuda @ mejorar la cobesién del objeto. Una alta cohesion es una cualidad fundamental de disefo software, lo que significa que los diferentes aspectos de tn com- ponente de software (tal eomo un objeto, aunque también podria aplicarse a un método o a una biblioteca de objetos) deben ‘ajustar bien entre si". Un problema que suelen tener los programadores cuando disefian objeios es el de asignar demasia~ da funcionalidad al objeto. Por ejemplo, en el médulo para imprimir cheques, puede decidir que és necesario un objeto que sepa todo sobre eémo dar formato e imprimir. Probablemente, descubrir que esto es demasiado para un solo objeto y que hay que emplear tres © més objetos. Un objeto puede ser un catilogo de todos los posibles diseiios de cheque, al cual se le 1. Iniroducciin a los objotos 5 puede consultar para obtener informacién sobre oémo imprimir un cheque. Otro objeto o conjunto de objetos puede ser una interfaz de impresin genérica que sepa todo sobre las diferentes clases de impresoras (pero aada sobre contabilidads; por ello, probablemente es un candidato para ser comprado en lugar de escribirlo uno mismo). Y un tereer objeto podria util zar fos servicios de los otros dos para llevar a cabo su farea, Por tanto, cada objeto tiene un conjunto cobesivo de servicios que ofiecer: En un buen diseiio orientado a objetos, cada objeto hace una cosa bien sin intentar hacer demasiadas cosas. Esto ‘dems de permitir descubrir objetos que pueden adquirirse (el objeto interfaz de impresora), también genera nuevos obje- tos que se reutilizardn en otros dives. Tratar los objetos como proveedores de servicios es una herramienta que simplifica mucho. No silo es util durante et pro- eso de disetio, sino tambien cuando alguien intenta comprender su propio cédigo o reutilizar un objeto, Si se es capaz de ver el valor del objeto basindose en el servicio que proporeiona, sori mucho més fic adaptarlo al disedio, La implementaci6n oculta Resulta til descomponer el campo de juego en creadores de clases (aquellos que crean nuevos tipos de dates) y en progra- ‘adores de clientes* (los consumidores de clases que emplean los tipos de datos en sus aplicaciones). El objetivo del pro- _gramador cliente es recopilar una caja de herramientas completa de elases que usar para el desarrollo répido de aplicaciones. El objetivo del ereador de clases es construir una clase que exponga al programador cliente sélo lo que es necesario y man- tenga todo lo demas oculto, ;Por qué? Porque si esté oculto, el programador cliente no puede acceder a ello, lo que signifi- ca que el ereador de clases puede cambiar la parte oculta a voluntad sin preocuparse del impacio que la modificavién pueda implicar. Normalmente, la parte oculta representa las vulnerabilidades intemas de un objeto que un programador cliente poco cuidadoso o poco formado podria corromper ficilmente, por lo que ocultar Ia implementacién reduce los errores en Jos programas, En cualquier relacién es importante tener limites que todas las partes implicadas teagan que respetar. Cuando se crea usta biblioteca, se establece una relacién con el programador de clientes, que también es un programador, pero que debe cons- truir su aplicacién utilizando su biblioteca, posiblemente con el fin de obtener una biblioteca més grande. Si todos los miembros de una clase estan disponibles para cualquiera, entonces el programador de clientes puede hacer cualquier cosa con dicha clase y no hay forma de imponer reglas. Incluso cuando prefiera que el programadar de clientes no mani- pull direetamente algunos de los miembros de su elase, sin control de acceso no hay manera de impedirlo. Todo esti a Ja vista del mundo. Por tanto, la primera razén que justifica el control de acceso es mantener las manos de los programadores cliente apartadas de las partes que son necesarias para la operacién interna de los tipos de datos, pero no de la parte correspondiente ata inter- faz que los usuarios necesitan para resolver sus problemas coneretos. Realmente, es un servicio para los programadores de clientes porque pueden ver ficilmente lo que es importante pera clos y lo que pueden ignorar. La segunda razén del control de acceso es permitir al disefiador de bibliotecas cambiar el funcionamiento interno de Ia clase sin preocuparse de como afectari al programador de clientes. Por ejemplo, desea implementar una clase partieular de una forma sencilla para facilitar el desarrollo y mas tarde descubre que tiene que volver a escribirlo para que se eje- cute més ripidamente. Si Ia interfaz y In implementacién estin claramente separadas y protegidas, podra hacer esto ficil- mente, Java emplea tres palabras clave explicitamente para definir los limites en una clase: public, private y protected. Estos modificadores de acceso determinan quién puede usar las definiciones del modo siguiente: publie indica que el elemento ‘que le sigue esté disponible para todo el mundo. Por otro lado, la palabra clave private, quiere doeir que nadie puede acee- der a dicho elemento excepto usted, el creador del tipo. dentro de los metodos de dicho tipo. private es un muro de ladri- los entre usted y el programador de clientes. Si alguien intenta acceder a un miembro private obtendré un error en tiempo de compilacién. La palabra clave proteeted actiia como private, con la excepcién de que una clase heredada tiene neces «los miembros protegidos (protected), pero no a los privados (private). Veremos los temas sobre herencia enseguida, Java también tiene un acceso “predeterminado”, que se emplea cuando no se aplica uno de los modificadores anteriores. Normalmente, esto se denomina acceso de paguete, ya que las clases pueden acceder a los miembros de otras clases que pertenecen al mismo paguete (componente de biblioteca), aunque fuera del paquets dichos miembros aparecen como priva- dos (private), “Tein acuada por mi amigo Seo Meyers 6 Plonsa en Java Reutilizacion de la implementacion Una vez que se ha creado y probado una clase, idealmente deberia representar una unidad de cbdigo vitil, Pero esta reutili- Zzacién no siempre es tan facil de conseguir como era de esperar; se necesita experiencia y perspicacia para generar un dise- ‘ho de un objeto reutilizable, Pero, una vez que se dispone de tal diseflo, parece implorar ser reutilizado. La reutlizacién de cédigo es una de las grandes ventajas que proporcionan los lenguajes de programacidn orientada a objetos. La forma mas sencilla de reutilizar una clase consiste simplemente en emplcar directamente un objeto de dicha clase, aun= que también se puede colocar un objeto de dicha clase dentro de una elase nueva, Esto es lo que se denomina “erear un obje- to miembro”. La nueva clase puede estar formada por cualquier ntimero ¥ tipo de otros objetos en cualquier combinacién nevesaria para consexuir la fumcionalidad deseada en dicha nueva clase, Definir una nueva clase a pattir de clases existen~ tes se denomina camposicién (si la composicién se realiza de forma dindmica, se Hama agregacién), A memudo se hace refe- rencia a la composicién como una relacién “tiene un”, como en “un coche tiene un motor” cxene feat Este diagrama UML indica la composicién mediante un rombo relleno, que establece que hay un coche, Normalmente, yo utiizo una forma mis sencilla: s6lo una linea, sin el rombo, para indicar una asociacion.> La composicién conlleva una gran flexibilidad. Los objetos miembro de La nueva clase normalmente son privados, lo que les hace inaccesibles a los programadores de clientes que estin usando la clase. Esto le permite cambiar dichos miembros disturbar al c6digo cliente existente. Los objetos miembro también se pueden modificar en tiempo de ejecueién, con el fin de cambiar dindmicamente e! comportamiento del programa. La hereneia, que se describe a continuacién, no proporcio- na esta flenibilidad, ya que el compilador tiene que aplicar las restriceiones en tiempo de compilacién a las clases creadas por herencia. ado que la herencia ¢s tan importante en ta programacién orientada a objetos, casi siempre se enfatiza mucho su uso, de ‘manera que los programaddores novatos pueden llegar a pensar que hay que emplearla en todas partes. Esto puede dar lugar ‘4 que se hagan diseiios demasiado complejos y complicades. En lugar de esto, en primer lugar, cuando se van crear nue- vas clases debe considerarse Ia composicién, ya que es mas simple y flexible. Si aplica este método, sus disefios serin mis inteligentes. Una vez que haya adquiride algo de experiencia, seré razonablemente obvio euindo se necesita emplear la herencia, Herencia Por si misma, ta idea de objeto es una buena hertamienta. Permit unir datos y funcionatidad por concept, lo que permite representa la idea del problema-espacio apropiada en lugar de forzarel uso de ls idiomas de la maquina subyacente. Estos ‘conceptos se expresan como unidades fundamentals en el lenguaje de programacién utilizando la palabra clave class. SSin embargo, es una pena abordar todo el problema para crear una clase y luego verse forzado a crear una clase nueva que podria tener una funefonalidad similar Es mejor, si se puede, tomar la clase existents, clonarla y luego aftadir 0 modificar lo que sea necesario al clon. Esto es lo que se logra eon la herencia, con la excepeién de que la clase original (llamada clase base, superelase 0 clase padre) se modifica, el clon “modificado” (denominado clase derivada, clase heredada, subclase 0 clase hija) también refleja los cambios. base f erivada = Nenalmente; es sufieieme grado de date par a sayora de los dlagramsy no es uecesaioespeificar si se est usando ura agregaviono wa come pasicién, 4 Introduccién alos objetos 7 La flecha de este diagrama UML apunta de la clase derivada a la clase base, Como veremos, puede haber mis de una clase derivada, Un tipo hace més que describir las restriceiones definidas sobre un conjunto de objetos; también tiene una relacién con otros tipos. Dos tipos pueden tener caractersticas y comportamientos en comin, pero un tipo puede contener mas caracteristicas que el otto y también es posible que pueda manejar més mensajes (0 manejarlos de forma diferente). La herencia expresa esta simititud entre tipos utlizando el concepto de tipos base y tipos derivados. Un tipo base contiene todas tas caracteris- ticas y comportamientos que los tipos derivados de él comparten. Es recomendable crear un tipo base para representar el nieleo de tas ideas acerea de algunos de los objetos del sistema. A partir de ese tipo base, pueden deducitse otros tipos para expresar las diferentes formas de implementar ese nicieo. Por ejemplo, una maquina para el reciclado de basura clasifica los despendicios. El tipo base es “basure” y cada desperdi cio tiene tn peso, un Valor, ete. ¥ puede fragmentarse, mezclarse o descomponerse, A partir de esto, se detivan mis tipos ‘espeeificos de basura que pueden tener caracteristicas adicionales (uma botella tendré tm color) o comportamientos (el alu- ‘minio puede modelarse, el acero puede tener propiedades magnéticas). Adeutis, algunos comportamientos pueden ser dife- rentes (el valor del papel depende de su tipo y condicion). Utilizando la herencia, puede construir una jeranquia de tipos que cexprese el problema que est intentundo resolver en términos de sus tipos. Un segundo ejemplo es el ckisico ejemplo de la forma, quiz usado en los sistemas de diseto asistide por computadora.o en la simulacion de juegos. El tipo base es “forma” y cada forma tiene un tamatio, un color, tina posicién, ctc. Cada forma puede dibujarse, borrarse, desplazarse, colorearse, etc. A partir de esto, se derivan (heredan) los tipos especificos de formas (cir- culo, cuadrado, triéngulo, etc), eada una con sus propias caraciersticas adicionsles y comportamientos. Por ejemplo, cier- tas formas podrin voltearse. Algunos comportamientos pueden ser diferentes, como por ejemplo cuando se quiere calcular su drea, La jerarquia de tipos engloba tanto las similitudes con las diferencias entre las formas. Forma dibujan) borrar) rmover() obienerColor) definate) t Cireulo Cuadrado | | Triéngulo Representar la solucién en los mismos términos que el problema es muy itil, porque no se necesitan muchos modelos inter- mmedios para pasar de una descripcion del problema a una descripcién de la solucién. Con objetos, a jerarguia de tipos es el modelo principal, porque se puede pasar directamente de la descripcién del sistema en el mando real a Ia descripcisn de! sistema mediante cédigo. A pesar de esto, una de las dificultades que suelen tener los programadores con el diseflo orienta- do a objetos es que es demasiado sencillo ir del principio hasta el final. Una mente formada para ver soluciones complejas puede, iniciaimente, verse desconcertada por esta simplicidad, ‘Cuando se hereda de un tipo existente, se crea un tipo nuevo. Este tipo micvo no s6lo contiene todas fos miembros del tipo cexistente (sunque los privados estin ocultos y son inaecesibles), sino lo que es mas importante, duplica la interfaz de la clase base; es decir, todos los mensajes que se pueden enviar a los objetos de la clase base tambign se pueden enviar a los obje- to3 de Ia clase derivada, Dado que conocemas el tipo de una clase por los mensajes que se le pueden enviar, esto quiere decir que la clase derivada es de? mismo tipo que la clase base, En el ejemplo anterior, “un cireulo es una forma”, Esta equiva- Iencia de tipos a través de la herencia es tno de los eaminos fundamentales para comprender el significado de Ia programa- cién orientada a objetos. Puesto que la clase base y 1a clase derivada tienen la misma interfuz, debe exist alguna implementacién que vaya junto con dicha interfaz. Es decir, debe disponerse de algin eédigo que se ejecute cuando un objeto recibe un mensaje conereto, Si 8 Piensa en Java simplemente hereda una clase y no hace nada mis, los métodos de Ia interfaz de ta clase base pasan tal cual a la clase deri- vada, lo que significa que los objetos de la clase derivada no s6lo tienen el mismo tipo sino que también tienen el mismo ‘comportamiento, lo que no es especialmente interesante. Hay dos formas de diferenciar la nueva clase derivada de ta clase base original. La primera es bastante directa: simplemen- te, se afladen métodos nuevos ala clase derivada. Estos métodes nuevos no forman parte de la interfaz de la clase base, lo ‘que significa que ésta simplemente no hacia todo lo que se necesitaba y se le han afadido més métodos. Este sencilla y pri- mitivo uso de la herencia es, en ecasiones, la solucién perfecta del problema que se tiene entre manos. Sin embargo, debe considcrarse siempre la posibilidad de que la clase base pueda también necesitar e508 meétodos adicionales. Este proceso de descubrimiento ¢ iteracidn en un disefo tiene lugar habitualmente en la programacién orientada a objetos. Forma atbuian) borrar() mover() ‘obtenerColer) ofiirColor) d Circulo Cuadrado Triéngulo VoltearVertical) VoltearHorizontalt) ‘Aunque em ocasiones la herencia puede implicar (especialmente en Java, donde la palabra clave para herencia es extends) que se van a afadir métodos nuevos a la interfaz, no tiene que ser as{ necesariamente. La segunda y més importante forma de diferenciar la nueva clase es cambiando el comportamiento de un método existente de la clase base. Esto es lo que se denomina sustitucién del método. Forma aunt) borrar() mover() obtenerColor() definirColor() T Girculo Cuadrade | | Triangulo dlbujar() dibujar() dibujar() borrar() borrar() borrar() Para sustiir un método, basta con crear una nueva definicién para el mismo en la clase derivada. Es decir, se usa el mismo método de interfaz, pero se quiere que haga algo diferente en el tipo nuevo. Relaciones es-un y es-como-un Es habitual que la herencia suscite un pequetto debate: ,debe la herencia susttuir s6lo tos métodos de la clase base (y no afiadir métodos muevos que no existen en la clase base)? Esto significaria quc Ia clase derivada es exactamente del mismo 1 Inlioduccidn a los objetos @ tipo que la clase base, ya que tiene exactamente la misma interaz. Como resultado, es posible susttuir de forma exacta un ‘objeto de la clase derivada por uno de la clase base. Se podria pensar que esto es una sustitucion pura ya menudo se deno- ‘mina principio de sustiuetén. En cierto sentido, éta es la forma ideal de tratar Ia herencia. A menudo, en este caso, la rela- ‘in entre la clase base y las clases derivadas se dice que es una relacion es-in, poryue podemos decir, “un cireulo es una forma”. Una manera de probar la herencia es determinando si se puede aplicar la relaciGn es-un entre las clases y tiene sen- tido, A veces es nevesario aladir nuevos elementos de interfz a un tipo derivado, ampliando la interfaz. El tipo nuevo puede todavia ser sustituido por e tipo base, pero la susitucidn no es perfecta porque el tipo base no puede acceder a los métodos uovos. Esto se describe como una relacién es-como-z. BI tipo nuevo tiene I interfaz del tipo antiguo pero también con- tiene otros métodos, por lo que realmente no se puede decir que sean exactos. Por ejemplo, considere un sistema de ai acondicionado. Suponga que su domicilio esté equipado con todo el eableado para controlar el equipo, es decir, dispone de ‘una interfaz que le permite controlar el aire fio. Imagine que el aparato de aire acondicionado se estropea y lo reemplaza por ua bomba de calor, que puede generar tanto aire caliente como frio. La bomba de calor es-camo-un aparato de aire acondicionado, pero tiene mas funciones. Debido a que el sistema de control de su casa esté diseftado sdlo para controlar el aire fifo, estd restringido a la comunicacién s6lo con el sistema de fio del nuevo objeto, La interfiz del nuevo objeto se ha ampliado y ¢l sistema existente s6lo conoce la interfaz. original rmostato ‘Sistema de frio bajarTemperatura() confriar) f ‘Acondicionador Bomba de calor do atro enfriar() oniiarg calentar) Por supuiesto, una ver que uno ve este disefo, esti claro que Ia clase hase “sistema de aire acondicionado” no es general y formas = new ArrayList(); También se han efectuado modificaciones en muchos de los componentes de las bibliotecas estindar para poder aprovechar uso de genéricos. Como tendremos oportunidad de ver, los genérices tienen una gran importancia en buena parte del cédi- 0 utilizado en este libro, Creacién y vida de los objetos Una de las cuestiones crticas a la hora de trabajar con los objetos es Ia forma en que éstos se crean y se destruyen. Cada ‘objeto consigue una serie de recursos, especialmente memoria, para poder simplemente exist: Cuando un objeto deja de * Los cantenedores no pemitenalmacenar priv, pero la carctrsica de aiobxing de Java SES hace que esta resscci tenga pcs iaportanea, ablaremos de esto en detale mis adelante enc He, 14 Piensa en Java ser necesario, es preciso eliminarl, para que se liberen estos recursos y puedan emptearse en alguna otra cosa. En los casos ‘ms simples de programacidn, el problema de borrar los objetos no resulta demasiado complicado. Creamos el objeto, lo "usamos mientras que es necesario v después lo destruimos. Sin embargo, no es dificil encontrarsesituaciones bastante mas complejas que ésta ‘Suponga por ejemplo que estamos diseftando un sistema para gestionar el trfico aéreo de un aeropuerto (el mismo modslo secviia para gestionar piezas en un almacén o para un sistema de alquiler de videos o para uns tienda de venta de masco- tas). A primera vista el problema parece muy simple: creamos un contenedor para almacenar las acronaves y luego crea- ‘os una nueva aeronave ¥ la insertamos en el contenedor por cada una de las seronaves que entren en Ia zona de control el trifico aéteo. De cara al borrado, simplemente basta con eliminar el objeto aeronave apropiado en el momento en que el avidn abandone fa zona. Poro es posible que tengamos algtin otro sistema en el que queden registrados los datos acerea de los aviones: quiza se trate de datos que no requieran una atencién ‘an inmediata como la de la funcién principal de control del tice aéreo. Puede que se trate de tn registro de los planes de vuelo de todos los pequefios aeroplanos que salgan del aeropuerto. Entonces, po- driamos definir un segundo contenedor para esos aeroplanes ¥, cada vez que se creara tin objeto aeronave, se introduciris tambien en este segundo contenedor si se trata de un pequefo aeroplano. Entonees, algiin proceso de segundo plano podria realizar operaciones sobre los objetos almacenados en este segundo contenedor en los momentos de inactividad. ‘Ahora el problema ya es mis complicado: ;cdmo podemos saber cnsindo hay que destruir los objetos? Atin cuando nosotros hayamos terminado de procesar un objeto, puede que alguna otra parte del sistema no lo haya hecho. Este mismo problema ‘puede surgir en muchas otras situaciones, y puede llegar a resultar enormemente complejo de resolver en aquellos sistemas de programacién (como C++) en los que es preciso borrar explicitamente un objeto cuando s¢ ha terminado de utilizar. 4Dénde se almacenan los datos correspondientes a un objeto y emo se puede controlar el tiempo de vida del mismo? En (C+, se adopt el enfoque de que el control de fa eficiencia es el tema més importante, por lo que todas las decisiones que- dan en manos del programador. Para conseguir la maxima velocidad de ejecucién, las caractersticas de almacenamiento y “" Wh ‘También podlemos usar c6digo HTML como en cualquier otre documento web, para dar formato al texto normal de las des- cripeiones: object /Bocumentation3 java Se puede incluaoc/em> insertar una lista:
  1. Elemente uno
  2. Elemento dos 1i> Blenente tres
h } * Mh ‘Observe que. dentro del comentario de documentacién, los asteriscos situados al principio de cada lines son ignorados por Javadoc, junto con los espacios iniciales, Javadoc reformatea todo para que se adapte al estilo estandar de la documenta cidn. No utilice encabezados como

0
en el HTML embebido, porque Javadoc inserta sus propios encaberados 4 10s que nosotros inecluyamos interferirin con ellos. Puede utilizarse HTML embebido en todos los tipos de comentarios de documentacidin: de clase, de campo y de método. Algunos marcadores de ejemplo He aqui algunos de los marcadores Javadoc disponibles para la documentacion de cédigo. Antes de tratar de utilizar Javadoc de forma seria, consulte la documentacién de referencia de Javadoe dentro de la documentacién del JDK, para ver las dife- rentes formas de wo de Javadoc, @see Fste marcador permite hacer referencia @ ta documentacién de otras elases. Javadoc generard el eédigo HTML nevesario, hipervineuland los marcadores @see 10s otros fragmentos de documentacién, Las formas posibles de uso de este ma dor som: see nombreclase @see nonbreclase-conpletanente-cualificado see nowbreclase-conpletanente-cualificado #nonbre-nétode ‘Cada uno de estos marcadores ahade una entrada “See Also” (Vase también) hipervinculada al archivo de documentacign _zenesado, Javadoc no consprueba los hipervinculos para ver si son validos. {@link paquete.clasetmiembro etiqueta ) Muy similar a @see, excepto porque se puede utilizar en linea y emples ta etiqueta como texto del hipervinculo, en lugar de “See Also” 38 Piensa en Java {@docRoot} Genera la ruta reativa al directorio raiz dela documentacton. Result itil para introducir hipervineulos expicitos 2 piginas del arbol de documentacién. {@inheritDoc) Este indicador hereda fa documentacidn de la clase base més prinima de esta clase, insertindola en el comentario del docu- mento actual. @version ‘Tiene la forma: eversion informacién-versisn en el que informacién-versién es cualquier informacién significativa que queramos incluir. Cuando se afade el indicador @version en la linea de comands Javadoc, la informacién de versién serd mostrada de manera especial en la documenta- cin HTML generada, @author ‘iene la forma: sauthor intormacisn-autor donde informacién-autor es, normalmente, nuestro nombre, aunque también padriamos inclu nuestra direction de correo clectrinico 0 cualquier otra informacién apropisda. Cuando se incluye el indieador @author en ta linea de comandos Javadoc, se inserta la informacion de autor de manera especial en la documentacion HTML generada. Podemos incluir miltiples marcadores de autor para ineluir una fista de autores, pero es preciso poner eos marcadores de forma consecutiva. Toda la informacisn de autor se agrupars en un (nico pérrafo dentro del e6igo HTML generado, @since Este mareador permite indicar la versién del cOdigo en la que se empezé a utilizar una caracteristica concreta, En la docu ‘mentacién HTML de Java, se emplea este marcador para indicar qué versiGn del JDK se esti utitizando. @param Se liza para la documentacién de métodos y tiene la forma: wparan nombre-pa: matzo descripeién donde nombre-parimetro es el identificador dentro de In lista de parimetros del método y deseripetén es un texto que puede continuar en las lineas siguientes. La descripcion se considera terminada cuando se encuentra un nuevo mareador de documentacidn, Puede haber miltiptes mareadores de este tipo, normalmente uno por cada parimetro @return Se utiliza para documentacién de métodos y su formato es el siguiente: ereturn descripcién dlonde deseripeién indica el significado del valor de retomo, Puede continuar en las Kneas si @throws Las excepeiones se estudian en el Capitulo 12, Tratamiento de erroves mediante excepciones. Por resumir, trata de abe tos que pueden ser “generados” en un método si dicho método falla, Aunque slo puede generarse un objeto exeepein cada ‘vez que invocamos un metodo, cada método conereto puede generar diferentes tipos de excepciones, todas las cuales habré ‘que deseribir, por lo que el formato de! marcador de excepcion es: Sthrows nonbre-clase-completanente-cualificado descripcién 2 Todo es un objeto 39 donde nombre-clase-completamente-cualificado proporcions un nombre no ambiguo de una elase de exeepcién definida en alguna otra parte y deseripeién (que puede ocupar las siguientes Lineas) indica la razén por la que puede generarse este tipo conereto de excepeidn después de ta Hamada i! método, @deprecated Se utiliza para indicar earactersticas que han quedado obsoletas debido a la introduecién de alguna otra caracteristica me- jorada. Este marcador indicativo de Ia obsolescencia recomienda que no se utilice ya esa caracteristica concreta, ya que ¢s probable que en el futuro sea eliminada, Lin método mareado como @deprecated hace que el compilador genere una adver- teneia si se usa. En Java SES, ef marcador Javadoc @deprecated ha quedado sustituido por la anoiacién (@ Deprecated (hablaremos de este tema en el Capitulo 20, Anotaciones). Ejemplo de documentacion He aqui de nuevo nuestro primer programa Java, pero esta vez con los eomentarios de documentacidn inchuidos: //+ object /Helionate java dmport java:ucil.+; /** EL primer programs de ejemplo del Libro + Muestra una cadena de caracteres y la fe + vauthor Bruce Eckel + gauthor wre.MindView.net + oversion 4.0 public class Hellopate ( /** punto de entrada a la clase y a la aplicacién. + @param args matriz de argunentos de cadena * Gthrows exceptions No se generan excepciones “4 public static void main(string(] args) { System.out.printin("Hello, it's: "); Systen.out-printin{new Date()); .cha actual. ourput: (55% match) Rello, it's. Wed Oct 05 14:39:36 MDT 2005 “S/he La primera linea del archivo utiliza una téeniea propia del autor de! libro que consiste en incluir “f° como marcador espe cial en Ia linea de comentarios que contiene el nombre del archivo fuente, Dicha linea contiene la informacién de ruta del archivo (object indica este capitulo) seguida del nombre del archivo. La tltima linea también termina con un comentario, y ste ("i:~") indica el final del lstado de e6digo fuente, lo que permite actualizarlo automaticamente dentro del texto de este libro después de comprobario con tn compilador y ejecutarlo El mareador /* Output: indica ct comienzo de la salida que generar este archivo, Con esta forma concreta, se puede com- probar automaticamente para verificar su precision. En este caso, el texto (85% match) indica al sisteima de pruchas que la salida sera bastante distnta en cada sucesiva cjecucién del programa. por lo que silo cabe esperar un 55 por ciento de corre= lucién eon la salida que aqui se muestre, La mayoria de los ejemplos del libro que generan una salida contendrin dicha sali da comentadla de esta forma, para que el lector pueda ver la salida y saber que lo que ha obtenido es correct Estilo de codificacion Fl estilo descrito en el manual de convenios de cédigo para Java, Cose Conventions for the Java Programming Language’, consiste en poner en maytiseula la primera letra del nombre de una clase. Si et nombre de la clase esti compuesto por varias * Para aborat espacio tao en ebro como eax presenaciones de fos seminars th hess pi segura la rectrices que se marc en ese lest, pero let poet ver gu el esl empleaden el ibe se jst lo mua posible al estindar recomend en Sa, 40. Piensa en Java palabras, ésas se escriben juntas (es decit, no se emplean guiones bajos para separarlas) y se pone en mayiscula la prime- ra letra de cada una de Ins palabras integrantes, como en: class AiltheColorsoftheRainbow ( // ... Para casi todos los demas elementos, como por ejemplo nombres de métodos, campos (variables miembro) y referencias & “objetos, el estto aceptado es igual que para las clases, salvo porque ta primera letra del identificador se escribe en minis cul, por ejemplo. class AlltheColorsoftheRainbow ( int anintegerRepresentingcolors: void changeThenucotTheColor {int newiue) ( Ww At sis ) Recuerde que cl usuario se veri obligado a escribir estos nombres tan largos, asi que procure que su longitud no sea exce- E1 cédigo Java que podri encontrar en las bibliotecas Sun también se ajusta # las directrices de ubicacién de Hlaves de aper- tura y ciette que herios uilizado en este libro, Resumen El objetivo de este capitulo es explicar los conceptos minimos sobre Java necesarios para entender cémo se eseribe un pro- grama sencillo, Hemos expuesto una panorimica del lenguaje y algunas de las ideas basicas en que se fundamenta, Sin embargo, los ejemplos includ hastn ahora tenian todos ellos In forma “haga esto, luego lo otro después lode mas ala” En los dos capitulos siguientes vamos a presentar los operadores hasicos utilizados en los programas Java, y luego mostra- remos cémo controlar efi del programa Ejercicios Normalmente, distribuiremos los ejercicios por todo cl capitulo, pero en éste estibamos aprendiendo a escribir programas baisicos, por lo que decidimos dejar los ejercicios para e! final. E! ndmero entre paréntesis incluido detras del niimero de ejercicio es un indicador de la dificultad det ejercicio dentro de una scala de 1-10 Puede encontrar las soluciones a los ejercicios seleccionados en el documento electronica The Thinking in Java Annotated Solution Guide, a \n venta en www. MindView.net. Ejercicio 1: (2) Cree una clase que contenga una variable int y otra char que no estén inicializadas ¢ imprima sus valo- res para verifcar que Java se encarga de realizar una inicalizacin predeterminada. Ejercicio 2: (1) A partir del ejemplo HelloDate,java de este capitulo, cree un programa “hello, world” que simplemen- te muesire dicha frase, S6lo necesitaré un método dentro de la clase, (el método “main” que se ejecuta al arrancar el programa). Acuérdese de definir este método como static y de incluir la lista de argumentos, incluso aunque no la vaya a utilizar. Compile el programa con javac y ejeciitelo con java. Si esta utilizan- do otro entorno de desarollodistinto de JDK, averigie cémo compar y ejecutarprograrmas en dicho eterno, Ejercicio 3: (1) Recopile los fragmentos cle e6digo relacionadas con ATypeName y transfrmelos en un programa que se pueda compilary ecu Ejercicio 4: (1) Transforme los fragmentos de codigo DataOnly en un programa que se pueda compilar y ejecutar. Ejercicio 5: (1) Modifique el ejereicio anterior de modo que los valores de los datos en DataOnly se asignen e impri= rman en main ). Ejercicio 6: (2) Escriba un programa que incluya e invoque el meétodo storage( )definido como fragmento de c6di ent eapitulo. Ejercicio 7: Ejercicio 8: Ejercicio 9: Ejercicio 10: Ejercicio 11: Ejercicio 12: Ejercicio 13: Ejercicio 14: Ejercicio 15: Ejercicio 16: 2 Tedoesun objeto 41 (2) Transforme los fragmentos de eddigo Incrementable en un programa funcional (G) Escriba un programa que demuestre que, independientemente de cuintos objetos se creen de una clase concreta, sélo hay una unica instancia de un campo static concreto definido dentro de esa clase. (2) Escriba un programa que demuestre que ¢l mecanismo sutomitico de conversidn de tipos funciona pia todos los tipos primitivos y sus envoltrios (2) Escriba un programa que imprima tres sngumentos extraidos de la linea de eomandos, Para hacer esto, necesitari acceder con el indice correspondiente a la matriz de objetos String extraida de la linea de comandos. (1) Transforme el ejemplo AUTheColorsOfTheRainbow en un programa que se pueda compilar y cle= uta. (2) Locative el e6digo para La segunda versidn de HelloDate,java, que es el ejemplo simple de documen- tacién mediante comentarios. Ejecute Javadoc con ese archivo y comprucbe los resultados con st explo~ rador web, (1) Procese Documentation! java, Documentation2.java y Documentation3,ja fique la documentacién resultante con su explorador web, (1) Afsda tna lista HTML de elementos a con Javadoc. Veri- documentacién det ejercicio anterior. (1) Tome el programa det Ejercicio 2 y anidale comentarios de documentacién. Extraiga esos comentarios de documentacidin Javadoc para generar un archivo HTML y visualicelo con su explorador web. (1) En ef Capitulo ciin y limpieza,localice el ejemplo Overloading,java y afada documenta- cidn de tipo Javadoc, Extraiga los comentarios de dacumentacion Javadoc para generar un archivo HTML, y visualicelo con su explorador web. Operadores En el nivel inferior, los datos en Java se manipulan utilizando operadores. Puesto que Java surgié a partir de C++, la mayoria de estos operadores les serin familiares a casi todos los programadores de C y C+, Java ha afiadido también algunas mejoras y ha hecho algunas simplificaciones. Si esté fuiliarizado con la sintaxis de C 0 C+, puede pasar ripidamente por este cap(tulo y el siguiente, buscando aque- Ilos aspectos en los que Java se diferencie de es6s lenguajes. Por el contrario, si le asaltan dudas en estos dos eapitulos, repase el seminario multimedia Thinking in C, que puede descargario gratuitamente en ww: MindView net. Contiene confe- rencias, presentaciones, ejercicios y soluciones especificamente diseflados para familiarizarse con los fundamentos necesa- rios para aprender Java, Instrucciones simples de impresion En el capitulo anterior, ya hemos presentado la instruceién de impresién en Java: systen.out printin(*tn montén de texto que escribir") ; Puede observar que esto no es sélo un montin de texto que escribir (lo que quiere decir muchos mavimientos redundantes de los dedos), sino que también resulta bastante incdmode de leer. La mayoria de los lenguajes, tanto antes como después de Java, han adoptado una técnica mucho mas sencilla para expresar esta instruceiéin de uso tan comin, En el Capitulo 6, Conta! de acceso se presenta el concepto de importaciéin estatica afiadido a Java SES, y se crea una peque- ‘a biblioteca que permite simpliffear la esertura de las instruceiones de impresién. Sin embargo, no es neeesario compren: der los detalles para comenzar «utilizar dicha biblioteca, Podemos reescribir el programa del dtimo capitulo empleando esa ‘eva biblioteca: (J: opexators/xeliovate.java import java.util.+; import static ast mindview.ueil. Print. publ 6 Hellotate { public static void main(stringl] args) { print ("Hello, it's: "); print (new Date()): ) /* Gurput: (55€ match) Hello, it's: Wed Oct 05 14:29:08 Mor 2005 wih Los resultados son mucho més limpios, Observe la insercn de a palabra clave static en la segunda instruccién import. Para emplear esta biblioteca, es necesario descargar el paquete de cédigo del libro desde wirw: Mind¥iewner 0 desde algu- ‘no de los sitios espejo. Descomprima el arbol de cddigo y afiada el directorio raiz de dicho arbol de c6digo a la variable de tentomo CLASSPATH de su computadora (mas adelante proporcionarcmos una introduccién completa a le variable de ruta CLASSPATH, pero es muy probable que el lector ya esté acostumbrado a lidiar con esa variable. De hecho, es una de las botallas mais comunes que se presentan al intentar programar en Java) 44 Pensa en Java Aunque fa utilizacion de net.mindview.util.Print simplifica enormemente la mayor parte del c6digo, su uso no ests justi- ficado en todas Ins oeasiones. Si'sélo hay unas pocas instrueciones de impresion en un programa, es preferible no incluir ta instruccién import y escribir el comando completo System.out.printin( ) Ejercicio 1: (1) Escriba un programa que emplee tanto la forma “corta" como la normal de la instruccion de impresién, Utilizacion de los operadores Java Un operadar toma tino o mas argumentos y genera un nuevo valor. Los argumentos s¢ ineluyen de forma distinta a Tas N= ‘madas normales a métodos, pero el efecto es el mismo, La suma, el operador més nario (+), la resta y el operador menos lunario (—), la multiplicacign (*), la division (/)y la asignacién (=) fuameionan de forma bastante similar a eualguier otro len= guaje de programaciéa. ‘Todos los valores preducen tn valora partir de sus operandos. Ademas, alzunos operadores cambian el valor det operando, lo que se denomina efecto colateral. El uso mis comiin de los operadores que modifican sus operandos consiste precisa- mente en crear ese efecto colateral, pero resulta conveniente pensar que el valor generado también esta disponible para nues~ tro ts0, al igual que sucede con los operadores que no tienen efectos eolaterales Casi todos los operadores funcionan ‘inicamente con primitivas. Las excepeiones son todos los objeios (y son una fuente de confusidn con los objetos). Ademis, la clase String soporia ‘+ y = "y f=", que finoionan eon Precedencia La precedencia de los operadores define la forma en que se evalia una expresién euando hay presentes varios operadores, Java tiene una serie de reglas especifieas que determinan el orden de evaluacién, La mis fil de recordar es que la multi- plicacivn y la division se realizan antes que la suma y Ia resta. Los programadores se olvidan a menudo de las restantes realas de precedencia, asi que conviene utilizar paréntesis para que el orden de evaluacién esté indicado de manera explici- ta, Por ejemplo, observe Ins instrucciones (1) y (2) (/+ operators /Precedence. java public class Precedence ( public static void main (str: acge) [ int xed, ye2 2 int a= x+y - 2/242: ya int b= x + ly - 21/2 + 2s 1 (2) Systen.out-printin(ta = "+ as" b+" +b); } 7* oarput a=5b=2 ay) Estas instrucciones tienen aspecto similar, pero la salida rios muestra que sus significados son bastante distintos, debido a ta tilizacion de paréntesis. Observe que fa instruccién System.out.printia( ) icluye ef operidor “+”. Fn este contexto, “+” significa “concatenacién de cadenas de caracieres” y, en caso necesario, “conversién de cadenas de caracteres.” Cuando el compilador ve un objeto String seyuido de “+ seguido de un objeto no String, intenta convertilo a un objeto String. Como puede ver en la salida, se ha efeetundo comrestamente In conversién de int a String para a y b. Asignacion [La asignacidn se realiza con e] operador =. Su significado es: “Toma el valor del lado derecho, a menudo denominado rva- lor. y edpialo en el lado inquierdo (a menudo denominado /valor)”. Un rvalor es cualquier constante, variable o expresion. ‘que genere un valor, pero un Ivalor dehe ser una variable determinada, designada mediante su nombre (es decir, debe exis tirun espacio fisico para almacenar el valor), Por ejemplo, podemos asignar un valor constante a una variable: 2 Operadores 45 podemos asignar nada a un valor constante, ya que una constante no puede ser un Ivalor (no podemos escribir Ls asignacién de primitivas es bastante sencilla, Puesto que la primitiva almacena el valor real y no una referencia a cual- quiet objeto, cuando se asignan primitivas se asigna el contenido de un lugar otro, Por ejemplo, si escribimos a = b para primitivas, et contenido de b se copia en a. Sia continuacién modificamos a el valor de b no se veri afectado por esta modi- ficacion, Como programador es lo que cabria esperar en la mayoria de las situaciones, Sin embargo, cuando asignamos objetos, la cosa cumbia, Cuando manipulamos un objeto fo que manipulamos es la referen- cia, asi que al asignar de un objeto a otro”, lo que estamos haciendo en la prictica es copiar una referencia de un lugar a ‘otro, Esto significa que si escribimos e = d para sendos objetos, lo que al final endremos es que tanto € como d apuntan al ‘objeto al que s6lo d apuntaba originalmente, He aqui un ejemplo que ilustra este comportamiento: //: operators/Assignnent. java // ta anignacién de objetos tiene su truco. import static net mindview.util.Print.+; class tank ( int level; ) public class Assignment | public static void main(String{] arge) { Tank C1 + mew Tanki); Tank t2 = new Tanke(); eldevel = 9; e2.level = 47; print ("ir ti.level: * + th.level + ", e2 devel: * + #2 level); en = 02 print(*2: £1.level; "+ ti.leval + 1 e2level: "4 tz evel); ti devel = 27; print ("3: ti.level: "+ ti.tevel 4 *, e2level: * + t2.level)y ) } /* ourpue: di t2level: 9, e2level: 47 2: tilevel: 47, 22.level: 47 3: tiilevel: 27, ©2level: 27 “ii La clase Tank cs simple, y se crean dos instancias de la misma (¢1 y #2) dentro dé main( ), Al campo level de cada objeto ‘Tank se le asigna un valor distinto, luewo se asigna t2 th, y después se modifica tl. En muchos lenguajes de programacién esperariamos que tI y £2 fueran independientes en todo momento, pero como hemos asignado una referencia, al cambiar et objeto t1 se modifica también et objeto 12. Esto se debe a que tanto 11 como (2 contienen la misma referencia, que esté apun- tada en ef mismo objeto (la referencia original contenida en t1, que apuntaba al objeto que tenia un valor de 9, fue sobrees> ita durante la asignacién y se ha perdido a todos los efectos; su objeto ser climinado por el depurador de memoria) Este fendmeno a menudo se denomina ereacién de alias, y representa wna de las earacterstieas fundamentales det modo en gue Java trabaja con los objetos. Pero, ;qué sucede si no queremos que las dos referencias apunten al final aun mismo obje- to? Podemos reeseribir la asignacién a otro nivel y utilizar: bilevel = ¢2.tevel; Esto hace que se mantengan independientes los dos objetos, eit lugar de descartar uno de ellos y asociar tl y 12 al mismo ‘objeto, Més adelante veremos que manipular los campos dentro de los objetos resulta bastante confuso y va en contra de los principios de un buen diseiio orientado a objetos. Se trata de un tema que no es nada trivial, as! que tenga siempre presente ‘que las asignaciones pueden causar sorpresas cuando se mianejan objetos. Ejercicio 2: (1) Cree uma clase que contenga un valor float y utiliceia para ilustrar el fensmeno de la ereacién de alias. 48. Piensa en Java Creacién de alias en las llamadas a métodos I fendmeno de la ereacidn de alias también puede manifestarse cuando se pasa un objeto a un método: //+ operators/Passcbject.java // #1 paso de objets a los métodcs puede no ser // lo que cabria esperar import static net.mindview.utit. tatty class Letter ( char '¢} ) tc Claes Passobje static void £ Let yee = 12! } public static void main(string{) args) ( ryl En muchos lenguajes de programacién, el método f() haria una copia de su argumento Letter dentro del imbito del méto~ do, pero aqui. una vee més, lo que se esta pasando es una referencia, por lo que Ia linea! yee sz Jo que-esti haciendo es cambiar el objeto que esti fuera de ((), El fenomeno de creacién de alias y su solucién es un tema complejo del que se trata en uno de los suplementos en linea dis pponibles para este libro. Sin embargo, conviene que lo tenga presente desde ahora, con el fin de detectar posibles errores. Bjercicio 3: (1) Cree uns clase que eontenga un valor float y utilicel durante Tas lamadas a métodos, para lust el fendmieno de ta creacién we alias. Operadores matematicos {Los operadores matematicos basicos son iguales a los que hay disponibles en la mayoria de tos lenguajes de programacién: suma (+), 1esta (-), divisin (/), multiplicacion (*) y médulo (%, que genera el resto de una division entera), La division entera trunca en lugar de redondear el resultado, Java también utiliza la notacion abreviada de C/C++ que realiza una operacion y una asignacién al mismo tiempo. Este tipo de operacién se denota mediante un operador seguido de un signo de igual, yes coherente con todos [os operadores del len- sguaje (alli donde tenga sentido). Por ejemplo, para sumar 4a la variable x y asignar el resultado a x, tilice: x+= 4, Este ejemplo muestra el uso de los operadores matemiticos; //: operators/Mathops. java // tlustra los operadores natenaticos. import java-util.+7 import static net.mindview,uril.peine.+ public class Mathops ( public static void main(string{] arge) ( // Crea un generador de nimeros aleatorics con una cierta semiliar Random rand = new Random(47); ant dy 4. // slegir valor entre 1 y 100 4 = vand.nextine (100) + 1; princitj : * + 3) k » rand.nextint (100) + print(e 2 + Lads ke printivj sk: H+ dd; fa39- pining er 4 a0; beak / 4s primetrk / goo" 4 4)y Lake 4: printitk * jo: % 4 4) fake bay printi*ke ¥ 9 + 402 3 ek print(*y tek fe dhe 7/ Pruebas con nimeroe en coma Hlotante: float u, ¥, w) // Se aplica también a los de doble precision ¥ = rand.nextFloat (1: print (ty "+ yy w= rand.nexcFioat() 1 peiatitw: "+ wir printity + wir t+ ube print(ty ws 4 uy uv ew peink(ty = ef * 4 whi wavy; peintity J win 4 4 wy 1/ Uo siguiente también funciona para char, // byte, short, int, Leng y double: print("w 42 vor t+ uy ea print(ta 2 vor "+ wy pelat ("a * aie vy print (tu fe vos "4 u); sue 5309854 0534122 + 0.5849576 + 0.478322 + 0.026358962 3 Operadores 47 48. Piensa en Java ow + 9.940527 ov: 10,471473 os vi 9.940527 5.277872 3.940527 “ Para generar nimetos, el programa crea en primer lugar un objeto Random, Si se creé un objeto Random sin ningun argu- rmento, Java usa la hora actual como semilla para el generador de niimeras aleatorios, y esto generaria una salida diferente en cada ejecucién de! programa. Sin embargo, en los ejemplos del libro, es importante que la stlida que se muestra al final de los ejemplos sea Lo mis cohterente posible, para poder verifiarla con herramientas externas. Proporcionando una semi- a (un valor de inicializacién para el generador de nimeros alestorios que siempre genera la misma secuencia para wna ddeterminada semilla a crear el objeto Random, se generardn siempre los mismos tiimeros aleatorios en cada ejecucidn del programa, por lo que la salida se podtra verificar.' Para gencrar una salida mas variads, pruebe a eliminar fa semilla en los ejemplos de libro. ] programa genera varios niimeros aleatorios de distintos tipos con el abjeto Random simplemente invocando los méto- «dos nextInt() y nextFloat( ) (también se pueden invocar nextLong( ) 0 nextDouble()). Fl argumento de mextInt( ) esta blece la cota superior para el nimero generado. La cota superior es cero, o cual no resulta deseable debido a la posibilidad de una division por cero, por lo que sumamios uno al resultado, Elercicio 4: (2) Escriba un programa que caleule la velocidad utilizando una distancia constante y un tiempo constant. Operadores unarios mas y menos EI menos unario (-) y el mis unario (+) son los mismos operadores que la suma y la resta binarias. El eompilacor deduce cui es el uso que se le quiere dar al operador a partir de ta forma en que esta escrita la expresion. Por ejemplo, la instruc eign: tiene un significado obvio, El compilador también podria dedueir el uso correcto en: x20 ¥ by pero esto podria ser algo confuso para el lector, por lo que a veces resulta mas claro escribir: x= at (-b); E] menos unario invierte el signo de los datos. F1 més unario proporciona una simetria con respeeto al menos unari que no tiene ningin efecto, Autoincremento y autodecremento Java, como C, dispone de uns serie de abreviaturas: Fas sbreviaturas pueden hacer que resulte mucho més facil escribir el ceébdigo; en euanto « la leetura, pueden simplificarla o complicarla Dos de fas abreviaturas mis utilizadas son los operadores de incremento y decremento (a menudo denominados operadores de autoincremento y autodeeremento), El operador de decremento es ~ y significa “disminuir en una uidad”, El operador de ineremento es ++ y signifiea “aumentar en una unidad”. Por ejemplo, si a es un valor int, la expresién +-+a es equivalen- tea (a=a+ 1). Los operadores de ineremento y decremento no sélo modifican la variable, sino que también generan el valor de fa misma como resultado. Hay dos versiones de cada tipo de operador, a menudo denominadas prefija y pastiia, Pre-incremento significa que el ope- rador ++ aparece antes de la variable, mientras que post-incremento significa que el operador ++ aparece detris de la vari ble, De forma similar, pre-decremento quiere decir que el operador ~~ aparece antes de la variable y past-decremento significa que el operador ~~ aparece detrés de la variable. Para el pre-incremento y el pre-decremento (es decir, ++4 0 —=a), se realiza primero la operacién y luego se genera el valor. Para el post-incremento y el post-decremento (es decit, a+ 0 —~a), se genera primero el valor y luego se realiza a operacién. Por ejemplo. 21 mimero 47 se wiizaba como “nero magico” en ura niveriad en la que eau, y desde enfonces lo lili, 3 Operadores 49 {T+ operators/autotne.java // iustra les operadores ++ y -~ import static net.mindview,util.print +; public class Autotne ( public static void main(String{] args) { = (/ Pre-incremento // Post-incremento print ("iss print(*i : + ah; print ( "4 <4); // Pre-decremento print( // Post-decrenento princ("t: "+ a); ied Mh Puede ver que para la forma prefija, se obtiene el valor después de realizada la operacién, mientras que para la forma post- fv, se obtiene el valor antes de que Ia operacién se realice. Estos son los tinicos operadores, ademés de los de asignacién, que tienen efectos colaterales. Modifican el operand en lugar de simplemente utilizar su valor. El operador de incremento es, precisamente, una de las explicaciones det por qué del nombre C++, que quiere decir “un paso ‘mis alla de C™, En una de las primeras presentaciones realizadas acerca de Java, Bill Joy (uno de los creadores de Java), dijo que “Java~C++——" (C mits ms menos menos), para sugerir que Java es C+ pero sin todas las complsjidades inne- ‘cesarias, por lo que resulta un Lenguaje mucho mas simple. A medida que vaya avantzando a to largo del libro, podra ver que ‘muchas partes son mas simples, aunque en algunos otros aspectos Java no resulta mucho mis senello que C+ Operadores relacionales Los operadores relacionales generan un resultado de tipo boolean, Evahian la relacién existente entre los valores de los ope- sands, Una expresin relacional produce el valor true sila telacién es ciertay false sino es cietta. Los operadores relacio nales son: menor que (<), mayor que >), menor o igual que (<=), mayor o igual que (>=), equivalente (==) y no equivalente (=), La equivalencia y la no equivalencia funcionan con todas las primitivas, pero las otras comparaciones no funcionan con el tipe boolean, Puesto que los valotes boolean sdio pueden ser true o false, las relaciones “mayor que” y “nienor que” ‘no tienen sentido, Comprobacion de la equivalencia de objetos Los operadores relacionales —y !~ tambien funcionan con todos los objetos, pero su significado suele confundir a os que comienzan a programar en Java. He agui un ejemplo: Id+ operators/Equivalence.java public clase. Equivalence { public static void main(String!] args) { Integer ni = new Integer ( integer nd = new Integer (47); System.out-printin(ni == 2); Systen.out-printin(nl t= m2); 80 Piensa on Java } 2+ output false La instruecién System.out.printin(al = n2) imprimir cl resultado de Ia comparacién booleana que eontiene, Parece que la salida deberia ser “true” y luego “false, dado que ambos objetos Integer son iguales, aunque el contenilo de los obje- tos son los mismos, las referencias no son iguales. Los operadores = y t= comparan refetencias a objetos, por lo que la salida realmente es “false” y luego “true”. Naturalmente, este comportamiento suele sorprender al principio los programa- does, {.Qué pasa si queremos comparar siel contenido de los objetos es equivalente? Entonees debemos utilizar ef método espe- ‘cial equals( ) disponible para todos los objetos (no para las primitivas, que funcionan adecuadamente con = y =), He agui Ja forma en que se emplea: (J: operators/BqualeMethod. java Public class EqualsMethod { public static void main(String{] args) { Integer ni = new Integer (<7); Integer n2 = new Integer (47) ; Systen.out .printIn(nt ,equals(n2)): ) ) 7+ oucpue true Wm El resultado es ahora ef que esperibamos, Aunque, en reabidad, las cosas no son tan seneillas, Si creamos nuestra propia clase, como por ejemplo: //) oparators/BqualeMethod? java // equals() predeterminado no compara los contenidos. class value int 4; public clase EqualsMethod2 { public static void main(string{} args) ( Value vi = new value(); Value v2 = new Value(); vide vad = 100; System.out .println(vi.equals (v2) ); } ) /* Output: false “i {os resultados yuelven a confindimos. El resultado es false. Esto se debe a que el comportamiento predeterminado de ‘equals() consiste en comparar referencias. Por tanto, menos que sustituyamos equals) en nucstra nueva clase, no obten= ‘dremos el comportamiento deseado. Lamentablemente, no vamos a aprender a sustituir unos métodos por otros hasta el eapi= tulo dedicado a la Rewilizaciéin de clases, ¥ no veremos cual es la forma adecuada de definir equals() hasta el Capitulo 17, Anélisis detallado de los contenedores, peo mientras tanto tener én cuenta el comportamicnto de equals ) nos puede aho- rar algunos quebraderos de cabeza, La mayoria de las clases de biblioteca Java implementan equals( ) de modo que compare el contenido de los objetos, en ugar de sus referencias. Ejercicio 5: (2) Cree una clase denominada Dog (perro) que contenga dos objetos String: name (nombre) y says (lndrido). Fn main( ), cree dos objetos perro con los nombres “spot” (que ladre diciendo “Rufl") y “scruffy” (que ladre diciendo, “Wurl!”), Después, muestre sus nombres y el sonido que hacen al ladrar. 3. Operadores 1 Ejercicio 6: (3) Continuando con el Ejersicio 5, cree una nueva referencia Dog y asiznela al objeto de nombre “spot” Realice una comparacidn utilizando = y equals( ) para todas las referencias. Operadores logicos Cada uno de los operadores logicos AND (&&), OR (|) y NOT (1) produce un valor beoteam igual a true o false basindo- se en la relacidn logica de sus argumentos. Este ejemplo utiliza los operadores relacionales y légicos: ‘ // Operadores relacionaies y 16a: import java-util.tz import static net.mindview,util.Peint +; jublic class Bool [ public static void main(String] args) ( Random rand ~ new Random(47); int i = rand.nextTat (100) int j= rand.nexttat (100) print = 4 1; pring(*} =" + 4): print(*i > jie" + (> 41) print (i = 9)): print(* <= jist + (i xe 31); print ("i -= jig * + (i == 3)); print("i te jig" + Gite 30) // Teatax int coo boolean no es legal en Java’ Hi peint("d ee fig + 4 ee He Ji peamtind || pis he Gi |) le U4 weaned 4 print ("(i < 10) && (j < 10) ie * 4 (le 40) GEG © 10)) 95 prine(*(4 < 10) || iy < a9) do * +40) [| © io) > ) } / ouepue: a= 58 3255 i> j de tree i

También podría gustarte