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

También podría gustarte