PIENSA EN JAVA
PIENSA EN JAVA
Cuarta Edicin
BRUCEECKEL President, MindView, ne.
Traduccin Vuelapluma
PEARSON , Prentice . , Hall
Madrid e Mxico e Santa Fe de Bogot e Buenos Aires e Caracas e Lima Montevideo e San Juan e San Jos e Santiago e Sao Paulo e White Plains e
/ Datos de catalogacin bibliogrfica
PIENSA EN JAVA Bruce EckeJ PEARSON EDUCACIN S.A. , Madrid, 2007
ISBN: 978-84-8966-034-2
Materia: Informtica, 004
Fonnato: 215 x 270 mm.
Todos los derechos reservados.
Pginas: 1004
Queda prohibida, salvo excepcin prevista en la Ley, cualquier forma de reproduccin, distribucin, comunica-cin pblica y transfonnacin de esta obra sin contar con autorizacin de los ti tulares de propiedad intelectual. La infraccin de los derechos mencionados puede ser constitutiva de delito contra la propiedad intelectual (arls. 270 y sgls. Cdigo Penal).
DERECHOS RESERVADOS 2007 por PEARSON EDUCACIN S.A. Ribera del Loira, 28 28042 Madrid
PIENSA EN JAVA Bruee Eekel
ISBN: 978-84-8966-034-2
Deposito Legal: M-4.753-2007 PRENTICE HALL es un sello editorial autorizado de PEARSON EDUCACIN S.A.
Authorized translation from the English language edition, entitled THINlUNG IN JAVA, 4" Edition by ECKEL BRUCE, published by Pearsoo Education loe, publishing as Prentiee Hall, Copyright 2006
EQillPO EDITORIAL Editor: Miguel Martn-Romo Tcnico editorial: Marta Caicoya
EQUIPO DE PRODUCCIN: Director: Jos A. CIares Tcnico: Mara Alvear
Diseo de Cubierta: Equipo de diseo de Pearson Educacin S.A.
Impreso por: Grficas Rgar, S. A.
IMPRESO EN ESPAA - PRINTED IN SPAIN Este libro ha sido impreso con papel y tintas ecolgicos
Dedicatoria A Dawn
Resumen del contenido
Prefacio ...................... . ..... . ..... . .... . ........ . . . .... xix Introduccin .... . .............. . ... . ...... . ..... . . ....... . . ... . . . xxv
1 Introduccin a los objetos . .. . . .. . ....... . ......... . . .... . . .. .. . ..... 1 2 Todo es un objeto ..... . ... . ..... . ...... . ................... . ...... 23 3 Operadores ................ . ...... . .......... . ............ . ...... 43 4 Control de ejecucin ......... . . ... . ........ . ... . .. . . . .... . ......... 71 5 Inicializacin y limpieza ..... . .......... .. ...................... . ... 85 6 Control de acceso .... . ....... . ............... . ................ . .. 121 7 Reutilizacin de clases ......... . ............ . ......... . . . ...... . . . 139 8 Polimorfismo .. .... . ... . . .. . .. .. .... . . .. ....... ... .......... . .. 165 9 Interfaces ... . ......................................... . . ....... 189 10 Clases internas .............. . ......... . . . ...... . ......... . . . .... 211 11 Almacenamiento de objetos .... . ..... .. ........ .. . . .. ............. 241 12 Tratamiento de errores mediante excepciones .. . ............ . .. . ..... 277 13 Cadenas de caracteres ........ . ...... . .. . . . . . ..... . ............... 317 14 Informacin de tipos . ........ . . . .. . ..... .. ......... . ............. . 351 15 Genricos . . .... . .................. . . . ..................... . ..... 393 16 Matrices . ................... .. . . . . .... .. ...... . . . . . . .. .. . ....... 483 17 Anlisis detallado de los contenedores .... .. ........................ 513 18 E/S ..... .. . . ............. . ........ . .. . ............. . . .... .. .. . .. 587 19 Tipos enumerados .... . .... .. . . . . . .. . . . .. ......... . ...... .. ...... 659 20 Anotaciones . ....... . ....... . .... . .. .. .... ... .. .. ......... .. . . ... 693 21 Concurrencia ......... . ..... . . . . .. . .... . ............... .. . .. ..... 727 22 Interfaces grficas de usuario ... . ...... . .. . . . ........ . . ...... . .. . .. 857 A Suplementos . ........... . . . .................... . ......... . ...... 955 B Recursos ......... . . . .. . .. . ......... . . . ...... . ........ . .. .. ..... 959
ndice .. .. . . ........ . ............ . .... . .......... . ....... .. ..... 963
Contenido
Prefacio ... .. ..... . .. . ........ .. ... .. . . xix Java SES Y SE6 ........ . . .. .. . .... ,. xx
Java SE6. . . . .... .. ..... . xx La cuarta edicin .. .. .. . . .. . .. ..... ... .... xx
Cambios ... . xxi Sobre el diseo de la cubierta .......... . .... xxii Agradecimientos. . . . . . . . . . . .......... XXll
Introduccin . ..... .. .. .... . ........... . xxv Prerrequisitos ... .... xxv Aprendiendo Java ..... .. . . , . . ... XXVI Objetivos ................ . . ..... XXVI Ensear con este libro ........... . ........ XXVll Documentacin del JDK en HTML . . . XXVI1 Ejercicios ............................. XXVll Fundamentos para Java . .. ........... .... . XXVIl Cdigo fuente ........ . ..... . . . .. . ..... XXVIII
Estndares de codificacin. . .. xxix
Errores .. ............................... xxx
1 Introduccin a los objetos . ... ...... . ... . . . 1 El progreso de la abstraccin ............ . ... 1 Todo objeto tiene una interfaz ..... . .. ........ 3 Un objeto proporciona servicios ...... . ........ 4 La implementacin oculta . .......... ......... 5 Reutilizacin de la implementacin ..... ... .... 6 Herencia. . . . . . . . . . . . . . . . . . . . . . .. . ...... 6
Relaciones es-un y es-como-un ....... ... . . .... . 8 Objetos intercambiables con polimorfismo ...... 9 La jerarqua de raz nica. . . .... ...... 11 Contenedores ... .......................... 12
Tipos paramctrizados (genricos) . . ... 13 Creacin y vida de los objetos ... . ... ........ 13 Tratamiento de excepciones: manejo de errores .. 15 Programacin concurrente .................. 15
Java e Internet. Qu es la Web?
16 . 16
Programacin del lado del clicntc ............. 18 Programacin del lado del servidor . . . . . . . . .. .. 21
Resumen........................ . ... 22
2 Todo es un objeto ....... . ...... . ........ 23 Los objetos se manipulan mediante referencias .. 23 Es necesario crear todos los objetos. . . 24
Los lugares de almacenamiento ... ..... ... . . . 24 Caso especial: tipos primitivos. . . . . . . . . . . . . ..25 Matrices en Java. . . . . . . . ... . .. .. . .. 26
Nunca es necesario destruir un objeto ......... 27 mbito. .. .. . . . . . . . . . .. . .. . .... . .. 27 mbito de los objetos .. ............. . .. 27
Creacin de nuevos tipos de datos: class ..... ' .. 28 Campos y mtodos . . . .... . ... . ... ... 28
Mtodos, argumentos y valores de retomo ...... 29 La lista de argumentos ....................... 30
Construccin de un programa Java .... 3 1 Visibilidad de los nombres. . .... 31 Utilizacin de otros componentes. . ... . .. . 31 La palabra clave static . . . . . . . . . . . .. 32
Nuestro primer programa Java .. 33 Compilacin y ejecucin. . . . 35
Comentarios y documentacin embebida ....... 35 Documentacin mcdiantc comcntarios .......... 36 Sintaxis. HTML embebido . ... . ... . .. . Algunos marcadores de ejemplo ... . ... . . .
. . 36 .... 37
.37 . . 39 Ejemplo de documentacin.
Estilo de codificacin. .. . . . . ... 39 Resumen .............. . ..... ... .. ... .. .. 40 Ejercicios ...... .. .. . . . ...... .. .......... 40
x Piensa en Java
3 Operadores ... ... .... ... . .. .... . . . .... . 43 Instrucciones simples de impresin ....... ... 43 Utilizacin de los operadores Java . 44 Precedencia ..... .......... . ...... . .. . .... 44 Asignacin ..................... ... .. ... . 44
Creacin dc alias en las llamadas a mtodos ...... 46 Operadores matemticos. . . . . .......... 46
Operadores unarios ms y menos .............. 48
Autoincremento y autodecremento . . . 48 Operadores relacionales . . . . . . . . . . . . . . . 49
Comprobacin de la equivalencia de objetos ..... 49 Operadores lgicos ........................ 51
Cortocircuitos . . . . . . . . . . . . . . . . . . . . . . . ... . 52
Literales. . . . . . . . . ........ . . . .......... 53 Notacin exponencial .. . . . ........ . . ........ 54
Operadores bit a bit. ............. . .... ... 55 Operadores de desplazamiento. . 55
. 58 Operador temario if-clsc Operadores + y += para String ............... 59 Errores comunes a la hora de utilizar operadores. 60 Operadores de proyeccin
Truncamiento y redondeo
... 60 ..... 61
Promocin ..... . . .... . . . . . . . . . . . ... . . .. . . . 62 Java no tiene operador "sizeof' . . . . . ... 62 Compedio de operadores . ....... .. .... . .... 62 Resumen .... ......... .... . . . . . ... . ... .. 70
4 Control de ejecucin .. . .................. 71 troe y false ........... . ..... . . ..... .. ... 71 if-else. . .. ..... . . . . . ... . . . . .. ..... 71 Iteracin
do-while ... .
for ...
.. .... .. . .. .. ........... 72 ... ...... .. . . . . . . . . . ... . . ... . 73
.. .. .. ...... ...... .. 73 El operador coma . . . . . . . . . . ... 74
Sintaxis[oreach ...... . . ..... ...... 74 returo ...... ...... . .. ... .... .. . . . . . .... 76 break y continue . .. .............. . .... ... 77 La despreciada instruccin "goto" .... .. ..... 78 switch ... ..... ....... .............. 81 Resumen ... ....... ........ . . ... . ....... 83
5 Inicializacin y limpieza . . .. . ... .. ... . . . . . 85 Inicializacin garantizada con el constructor .... 85 Sobrecarga de mtodos ..................... 87
Cmo se distingue entre mtodos sobrecargados .. 88
Sobrecarga con primitivas. ..... .. .. ... . . 89 Sobrecarga de los valores de retomo.
Constructores predetenninados . .. .. 92 . .. 92
La palabra clave tbis ....... ........ .... ... 93 Invocacin de constructores desde otros
constructores .... . . ... ... . .. .. . ... .. ... . 95 El significado de sta tic . . ... ............... . . 96
Limpieza: finalizacin y depuracin de memoria .............. . Para qu se utiliza finalizeO?
...... 97 .. . 97
Es necesario efectuar las tareas de limpieza ... 98 La condicin de terminacin . . .... . ... . ... .. .. 98
Cmo funciona un depurador de memoria
Inicializacin de miembros .. Especificacin de la ini cial izacin
Tnicializacin mediante constmctores .... Orden de inicializacin .....
Inicializacin de datos estticos .
... 100
.. 102 ... 103
104 105
.. . 106 Inicial izacin static explcita ................ 108
Iniciali zacin de instancias no estticas
Inicializacin de matrices ..... . ..... 109
.... 110 Listas variables de argumentos . 113
Tipos enwnerados ..... . ..... ..... . . . . .. .. 11 7 Resnmen ............ .... . . . . ... .. ..... 119
6 Control de acceso . .. . . . .. . . .... . . .. . .. . 121 package: la unidad de biblioteca ....... . ... . 122
Organizacin del cdigo . ............. . . 123
Creacin de nombres de paquete unvocos ...... 124
Una biblioteca personalizada de herramientas .. 126
Uti lizacin de importaciones para modificar el comportamiento . . ... . ... .. .. . .... . . 128
Un consejo sobre los nombres de paquete .. ... . . 128 Especificadores de acceso Java .... 128
Acceso de paquete .. . . 129 public: acceso de interfaz .. .. .. .. . .......... 129
private: ino lo toque! . . . . . . . . 130
protected: acceso de herencia .. 131
Interfaz e implementacin ................. 133 Acceso de clase .......... .. ........... 134 Resumen . ..... 136
7 Reutilizacin de clases .............. .. .. 139 Sintaxis de la composicin ...... ... .... .... 139 Sintaxis de la herencia ............. .. ... 142
Inicializacin de la clase base .. ......... . . .. . 143
Delegacin ....... . ....... . .... ... . . 145 Combinacin de la composicin
y de la herencia .... . ............ 147 Cmo garantizar una limpieza apropiada .. 148
Ocultacin de nombres . . . . . . . . . . . . .. . 151
Cmo elegir entre la composicin y la herencia 152 protected ....... . .............. . .... 153 Upcasting (generalizacin) ..... . . ..... ..... 154
Por qu "upcasling'? . . .. . . 155 Nueva comparacin entre la composicin
y la herencia. .. . . .. . . . . . . 155 La palabra clave final . . . . . . . . . . . . . 156
Datos final .. ....... .... . . . . .. ... 156
Mtodos final . . .. ... 159 Clases final
Una advertencia sobre final
Inicializacin y carga de clases ....
.. 161
. 16 1 ... 162
Inicializacin con herenc ia . . . . . . . . . . 162
Resumen. . . . . . . . . . 163
8 Polimorfismo . ... . . . . . . .. .. . . .... . .. .. 165 Nuevas consideraciones sobre la generalizacin 165
Por qu olvidar el tipo de un objeto . ..... 166 El secreto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Acoplamiento de las llamadas a mtodos ....... 168
Especi ficacin del comportamiento correcto 168
Amp1iabi1idad ....................... .
Error: "sustitucin" de mtodos privare
ElTor: campos y mtodos static Constructores y polimorfismo
Orden de las llamadas a los constructores.
. 171
. . 173 174
... 175 176
Herencia y limpieza ...... 177 Comportamiento de los mtodos polimrficos
dentro de los constructores . . .. ... . 181
Tipos de retorno covariantes .. . . . ..... 183 Diseo de sistemas con herencia .... ... ... . 183
Sustitucin y extensin .... . .. .. ....... . .... 184
Especializacin e infonnacin de tipos en tiempo de ejecucin .. .186
......... 187 Resumen ......... .
9 Interfaces ... . ........ ... ..... .. .. . ... 189 Clases abstractas y mtodos abstractos ....... 189 Interfaces. . . . . . . . . . .. . . . . . . .. . . . . . .. 192 Desacoplamiento completo .... . . . .. . . . .. . . 195 "Herencia mltiple" en Java ......... . ...... 199
Contenido xi
Ampliacin de la interfaz mediante herencia .. 201 Colisiones de nombres al combinar interfaces ... 202
Adaptacin a una interfaz .. Campos en las interfaces
....... 203 .205
Inicializacin de campos en las interfaces. .205 Anidamiento de interfaces. . . . . . . 206 Interfaces y factoras ............. . . . ...... 208 Resumen ........ ........ .. . . ....... .... 210
10 Clases internas .. .. . . .. ......... . . .. ... 211 Creacin de clases internas .... ... . ..... 2 11 El enlace con la clase externa .. Utilizacin de .this y .new .
.. .... ..... 213 .... . ..... 214
Clases interna y generalizacin Clases internas en los mtodos y mbi tos
Un nuevo an lisis del mtodo factora Clase anidadas .............. .
Clases dentro de interfaces .. .
Acceso al exterior desde una clase mltiplemente anidada .. .
Para qu se usan las clases internas? Cierres y retro llamada ..
..... 222
.224 .225
.... 226 .227 .229
Clases internas y marcos de control . . . ... 230
Cmo heredar de cIases internas ............ 236 Pueden sustituirse las clases internas? ....... 236 Clases internas locales .................... 238 Identificadores de una clase interna .. 239 Resumen ......................... . ..... 239
11 Almacenamiento de objetos .. ... ... . ..... 241 Genricos y contenedores seguros
respecto al tipo ................. .... .. 242 Conceptos bsicos ....... .... . .. .... ...... 244 Adicin de grupos de e lementos .245 Impresin de contenedores ................ 247 List ...................... . ............ 248 Iterator. . . . . . . . . . . . . . . . . . . 252
Listl te.-ator . . .. . 254
LinkedList ...... .. .. ... . . .. . . ... .. .. .. . 255 Stack. . . . . . . . . . . . . . . . . . . ... 256 Set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .258 Map ...... . .... . . . . . . . . ... . . .... .... ... 260 Queue.... ....... ........ . ... 263
PriorityQucue. . . . . . . . . . . . . . 264 Comparacin entre CoHection e Iterator ..... 266
xii Piensa en Java
La estructura foreach y los iteradores ... 268 El mtodo basado en adaptadores. . . . . . .. 270
Resumen. . . . . . . . . . . . . ...... . 273
12 Tratamiento de errores mediante excepciones . ... ........... .. 277
Conceptos ....................... . . .... 277 Excepciones bsicas ...... . . ........ 278
Argumentos de las excepciones. . . 279 Deteccin de una excepcin ................ 279
El bloque try . . . . .. 280 Rutinas de tratamiento de excepciones ......... 280
Creacin de nuestras propias excepciones .. 281 Excepciones y registro. . . . . . . . . . . . . . . . . .. 283
La especificacin de la excepcin .... . .. .... 286 Cmo capturar una excepcin .. . . . ..... 286
La traza de la pila .. 288 Regeneracin de una excepcin ....... . .. .... 289 Encadenamiento de excepciones ... .... . ..... 291
Excepciones estndar de Java .............. 294 Caso especial: RuntimeException .. . . . . . ..... 294
Realizacin de tareas de limpieza con finally .. 295 Para qu sirve finally? . . . . . . . . . . . . . .. 296 Utilizacin de finaU)' durante la ejecucin
de la instruccin return. .. 299 Un error: la excepcin perdida .... 300
Restricciones de las excepciones ............ 301 Constructores ................... .. . ..303 Localizacin de excepciones Enfoques alternativos.
............. 307
. ............. 308 Historia .. Perspectivas ... . ......... .
Paso de las excepciones a la consola
.309
.3 10 ... 312
Conversin de las excepciones comprobadas en no comprobadas ...... 3 13
Directrices relativas a las excepciones . 315 Resumen ............................... 315
13 Cadenas de caracteres ... ............ ... 317 Cadenas de caracteres inmutables . . . . . . . . . 317 Comparacin entre la sobrecarga de '+' y
StringBuilder . . . . . . . . . . . . . . . . . 318 Recursin no intencionada .... ........ ..... 32 1 Operaciones con cadenas de caracteres ....... 322 Formateo de la salida ....... . . ... 324
printfO . . . . . ... .. . ..... 324
System.out.format( ) .... .. . . .... ... . . ... . . 324 La clase Formatter ..... Especificadores de formato ..
. . . . . .... ..325 . ........ 326
Conversiones posibles con Formattcr . . 327 String.format(). . . . . . . . . . . 329
Expresiones regulares ........ ..... 331 Fundamentos bsicos. . . . . . . . . . . . . 33 1
Creacin de expresiones regulares ... .... ...... 333
Cuantificadores Pattcrn y Matcher
split(). Operaciones de sustitucin reset( ) .
. 335 . ... . 336
. 342 . 343
. .. 344 Expresiones regulares y E/S en Java .... 345
Anlisis de la entrada . . ............. 346 Delimitadores de Scanner .348 Anlisis con expresiones regulares. . ..... 348
StringTokenizer. ............. . .... 349 Resumen. . ..... .. . . . ....... . . .. .... 350
14 Informacin de tipos . ........... ... . ... 351 La necesidad de RTTI. ........ . . El objeto Class ....
. ... 35 1 .353
Literales de clase ........ . .357 Referencias de clase genricas .. 359 Nueva sintaxis de proyeccin ................ 36 1
Comprobacin antes de una proyeccin. .361 Utilizacin de literales de clase
Instanceof dinmico .. . 367
..... 368 Recuento recurs ivo. . . . . . . . . . . . . . . . . . . 369
Factoras registradas . . . . . ..... ........ 37 1 instanceof y equivalencia de clases .......... 373 Reflexin: infonnacin de clases en tiempo de
ejecucin ............................ 374 Un extractor de mtodos de clases . 375
Proxies dinmicos. . . . . . . . 378 Objetos nulos. . . . . . . . . . . . . . . . . . . . . . . . .. 38 1
Objetos maqueta y stubs .. Interfaces e informacin de tipos Resumen.
.387 .. 387
. .. .... 392
15 Genricos ..... .. ..................... 393 Comparacin con c++ .................... 394 Genricos simples ...... .... . . . . ....
Una biblioteca de tuplas
.394 .396
Una clase que implementa una piJa ..... 398 .. 399
.......... 399 RandornList ...
lnterfaces genricas Mtodos genricos .. ... ........... 403
Aprovechamiento de la inferencia del argumento de tipo ...... 404
Varargs y mtodos genricos. . .... 405 Un mtodo genrico para utilizar con
generadores . ............. 406 Un generador de propsito general . Simplificacin del uso de las tuplas
. .... 407
..... 408 Una utilidad Set .... ... ............. 409
Clases internas annimas . . . . ......... 412 Construccin de modelos complejos ......... 4 13 El misterio del borrado ............. 4 15
La tcnica usada en C++ . . .. ............ 417 Compatibi lidad de la migracin. .419
.4 19 El problema del borrado de tipos . .... . . . . . El efecto de los lmites
Compensacin del borrado de tipos Creacin dc instanc ias de tipos.
.... 42 1 .... 424
..425 Matrices de genricos . . . . . . . . . . . . . . . . .. 427 L~i~s ... . ...................... ~l Comodines ........... .. ..... ..... 434
Hasta qu punto es inteligente el compilador? .. 436 Contravarianza .... Comodines no limitados Conversin de captura.
Problemas .....
............... 438 .. 440
. .... 444 . ... 445
No pueden usarse primitivas corno parmetros de tipo. . . . .. 445
Implementacin de interfaces parametrizadas . ... 447 Proyecciones de tipos y advertencias ..... 447 Sobrecarga. . .. 449 Secuestro de una interfaz por parte de la clase
base Tipos autolimitados ........ .
. 449 .. ......... 450
Gcnricos curiosamente recurrentes .. ..... 450 .... 451 Autolimitacin
Covarianza de argumentos. . .. 453 Seguridad dinmica de los tipos ... . . ....... 456 Excepciones Mixins ........... .
Mixins en C++.
.. 457
.. 458 ............. 459
Mezclado de clases utilizando interfaces.. . .... 460
Contenido xiii
Utilizac in del patrn Decorador .. Mixins con proxies dinmicos.
. .... 461 . .462
Tipos latentes . .......................... 464 Compensacin de la carencia de tipos latentes .. 467
Reflexin . . . . . . . . . . . . . 467 Aplicacin de un mtodo a una secuencia .. . .. 468 Qu pasa cuando no disponemos de la intcrfaz
correcta? . . . . . . . . . . . . 471 Simulacin de tipos latentes mediante adaptadores472
Utilizando los objetos de funcin como estrategias .................. 474
Resumen: realmente es tan malo el mecanismo de proyeccin? ..... . ..479 Lecturas adicionales .. . . . . . . . . . . . . 481
16 Matrices ...... .. .. .................. . . 483 Por qu las matrices son especiales . . 483 Las matrices son objetos de primera clase .... 484 Devolucin de una matriz ... . .... 487 Matrices multidimensionales .. 488 Matrices y genricos .......... .... .... 491 Creacin de datos de prueba .......... 493
Array,.fillO . . . . . . . . . . . . . . . ... 493 Generadores de datos ............. 494 Creacin de matrices a partir de generadores . ... 498
Utilidades para matrices . . .. 502 Copia en una matriz Comparacin de matrices . ....... . Comparaciones de elementos de matriz Ordenacin de una matriz Bsquedas en una matriz ordenada
Resumen .................... .
. ... 502 . . .. ... 503
... 504 .. 507 .. 508
....... 509
17 Anlisis detallado de los contenedores . ... 513 Taxonoma completa de los contenedores ..... 513 Rclleno de contenedores. . . 514
Una solucin basada en generador .... ... ..... 515 Generadores de mapas . Utilizacin de clases abstractas
. . 516 ... 519
Funcionalidad de las colecciones .. .. . . ..... 525 Operaciones opcionales ............. .. .... 528
Operaciones no soportadas . ...... .. ..... 529 Funcionalidad de List .... . ......... 530 Conjuntos y orden de a~nacenam iento. . . . .. . 533
SortedSet. . . . . . . . . . . 536 Colas ... ............ . ..... . . . . .... 537
xiv Piensa en Java
Colas con prioridad. . . . . .. . . . . .... 538 Colas dobles. ....... . .. .. ........ . 539
Mapas ...... .. ..... . ..... . . . ........... 540 Rendimiento
SortedMap . .
. 541
.544 LinkedHashMap. . .... 545
Almacenamiento y cdigos hash ..... . . .. . . 545 Funcionamiento de hashCode( ) .. 548 Mejora de la velocidad con el almacenamiento
hash . . . . . . . . . . . . . . . . . .. 550
Sustitucin de hashCodeQ ......... . Seleccin de una implementacin
.... . 553 .... 558
Un marco de trabajo para pruebas de rendimiento 558 Seleccin entre listas ....................... 561
Peligros asociados a las micropruebas de rendimiento .... ...... . . .
Seleccin de un tipo de conjunto Seleccin de un tipo de mapa
.566 ... 567
.. ... 569 Utilidades ....................... 572
Ordenaciones y bsquedas en las listas
Creacin de colecc iones o mapas no modificables
.. 575
.... 576 Sincronizacin de una coleccin o un mapa .... 577
Almacenamiento de referencias. . . . . . . 578 WeakHashMap. . . . .. . . . . .. . . . . 580
Contenedores Java 1.0/1.1 ...... .. . ........ 581 Vector y Enumeration . . . . . . . . . . . . . . . .... 58 1
Hashtable . . . . .. ..... . ............. . ... 582 Stack . . .. ... . .. . . . ... 582 BitSet. . . . . . . . .. . . . . . . . . . . . . ..584
Resumen. . . . . ........ . . . .. . ..... 585
18 Entrada/salida . ....... . ................ 587 La clase File ...... .. ...... . ... 587
Una utilidad para listados de directorio. . ... 587
Utilidades de directorio .......... . . ... 590 Bsqueda y creacin de directorios ..... 594
Entrada y salida ...................... 596 Tipos de InputStream ..... .. ... . . . . . . , .... . 597
Tipos de OutputStream ..................... 598
Adicin de atributos e interfaces tiles . 598 Lectura de un flujo InputStream con
FiltcrInputStream .
Escritura de un flujo OutputStream con . . 599
FilterOutputStream ............. . ...... 599
Lectores y escritores ....... . .. , . . ........ 600
Orgenes y destinos de los datos . . . 601
Modificacin del comportamiento de los flujos dc datos. . . . . . . . . . . . . ... 601
Clases no modificadas .... 602
RandomAccessFile . . . .. . ............... 602 Utilizacin tpica de los flujos de E/S . ... 603
Archivo de entrada con buffer . . .. .. .... 603 Entrada desde memoria. . .......... .. .... 604
Entrada de memoria formateada .... .. .. . ..... 604
Salida bsica a archivo ..... . .... . .... . .... 605
Almacenamiento y recuperacin de datos ...... 607 Lectura y escritura de archivos de acceso
aleatorio .. .. 608
Flujos de datos canalizados. . ....... .. .... 609 Utilidades de lectura y escritura de archivos . . . 609
Lectura de archivos binarios . . . . . . . . . ..... 612
E/S estndar ..................... . ...... 6 12 Lectura de la entrada estndar ............... 613
Cambio de System.out a un objeto PrintWriter . .. 613 Redireccionamiento de la E/S estndar ... 613
Control de procesos . . . . . . . . . . . . . . 614 Los paquetes new ...... ...... .... ...... 616
Conversin de datos . 618
Extraccin de primitivas ..
Buffers utilizados como vistas
..... . . ........ 62 1
... 622
Manipulacin de datos con buffers .... . . . .. 625 ... 625 Deta lles acerca de los buffers
Archivos mapeados en memoria. . .. 629
Bloqueo de archivos. . . 632
Compresin .................... . . . . . ... 634 Compresin simple con GZIP .. . . 635 Almacenamiento de mltiples archivos con Zip . . 635
Archivos Java (lAR) . . . ................ 637 Serializacin de objetos .. . . .... ... 639
Localizacin de la clase
Control en la serializacin ..
..... 642 .642
Utilizacin de la persistencia ...... ..... . . . . .. 649
XML .............................. .. .. 654 Preferencias .... . . . .......... . . .. . ....... 656 Resumen . . ......... .. .............. . 658
19 Tipos enumerados .......... . .... . ..... 659 Caractersticas bsicas de las enumeraciones .. 659
Utilizacin de importaciones estticas con las enumeraciones ..... .. . ... ... 660
Adicin de mtodos a lma enumeracin ...... 661 Sustitucin de los mtodos de una enumeracin . 662
Enumeraciones en las instrucciones switch ... 662 El misterio de values( ) . . . . . . . . .. 663 Implementa, no hereda ..... o o o o o o o 665 Seleccin aleatoria ... . ......... . , . .. 666 Utilizacin de interfaces con propsitos de
organizacin .. ... . . o 667 Utilizacin de EnurnSet en lugar de
indicadores ........ o o o o o o 671 Uti lizacin de EnurnMap ........ 672 yltodos especficos de constante ............ 673
Cadena de responsabilidad en las enumeraciones 676 Mquinas de estado con enumeraciones. . . 680
Despacho ml tiple .. . ................... 684 Cmo despachar con enumeraciones ........... 686 Utilizacin de mwdos especficos de constante. 688 Cmo despachar con mapas EnurnMap.
Utilizacin de una matriz 2-D
Reswnen.
..690
.690 .... 691
20 Anotaciones o o o o o o o o o o o o o o o o o o o o o o o o o o 693 Sintaxis bsici:t ... 694
Definicin de anotaciones. . . .. 694
Meta-anotaciones ........ , ... 695 Escritura de procesadores de anotaciones , .... 696
Elementos de anotacin. . . 697 . . . 697
... ...... 697 Restricciones de valor predeterminado.
Generacin de archivos externos
Soluciones alternativas
Las anotaciones no soportan la herencia
Implementacin del procesador
.. 700
.... . . 700
Uti lizacin de apt para procesar anotaciones . 700
.. 703 Uti lizacin del patrn de diseo Visitante
con apt ..... , , , , , , , , .. ........ . ... . . 706 Pruebas unitarias basadas en anotaciones . , . 709
Utilizacin de @Unit con genricos .. 716 No hace falta ningn "agrupamiento" .. 717
Implementacin de@Unit ,., ...... . . . . . .... 717
El iminacin del cdigo de prueba . . 723
Resumen. . . . . . . . . . .. , o 724
21 Concurrencia o o o o o o o o o o o o o o o o o o o o o o o o o o 727 Las mltiples caras de la concurrencia .. , , . , , . 728
Ejecucin ms rpida . . . ....... . 728
Contenido xv
Mejora del diseo del cdigo .. ..... ,.. . . 730 Conceptos bsicos sobre hebras .. , , . o o 731
Definicin de las tarcas . . ....... . .. .... 731 La clase Thread .732 Utilizacin de Executor .... . 734
Produccin de valores de retomo de las tareas . . 736 Cmo donnir una tarea . , ..... .... . . . ... . 737 Prioridad.
Cesin del control .
Hebras demonio.
Variaciones de cdigo
Terminologa .
Absorcin de una hebra
Creacin de interfaces de usuario de
. 738 . .. 740
. , .. 740
.. 744
. .. , 748 ,748
rcspuesta rpida
Grupos dc hebras. . . . .. ......... 750
Captura dc excepciones ... . ... .. . .
Comparticin de recursos
, 751 . 751 .753
Acceso inapropiado a los recursos .... 754
Resolucin de la contienda por los recursos compartidos.. ................... . . 756
Atomicidad y volatilidad. . . .. . 760 Clases atmicas . ..
Secciones crticas
Sincronizacin sobre otros objetos. Almacenamiento local de las hebras
Terminacin de tareas El jardn ornamental Tcnuinacin durantc el bloqueo
. . ... 764 , , 765
. .. 770
... 77 1
0 772 .. 772
.. 775 Interrupcin. . ......... , ... .. . 776 Comprobacin de la existencia de una
interrupcin .
Cooperacin entre tareas waitO y notifyAIIO ... , ... . o o ,
notifyO y notifyAIIO,
Productores y consumidores. Productores-consumidores y colas Utilizacin de canalizaciones para la E/S
... 782
.784 .. , 784
.. ,788
. .... 791
.796
entre tareas . . . . . . . . . . . . . . . . . . . . . . . . . , 800
Interbloqueo . . . . . . , ..... o 801 Nuevos componentes de biblioteca
CountDownLatch .. CyclicBarrier
DelayQueue.
,805 .. 805
.... .. . 807
.... 809 PriorityBlockingQueue . . ,.,., . 0 ,., ... . . 811
xvi Piensa en Java
El controlador de invernadero implementado con ScbeduledExecutor . ........... ..... 814
Semaphore .......... . .. .. .. ..... 8 17 Exchanger ...... .. . . . . . . .. ..... . . .. ...... 820
Simulacin . . . . . . . . . . .. .. . . . . ... .. 82 1 Simulacin de un cajero Simulacin de un restaurante. Distribucin de trabajo . ...
Optimizacin del rendimiento
.... 82 1 ...826
. .... ... . . ..... 829 .............. 834
Comparacin de las tecnologas mutex .. 834 Contenedores libres de bloqueos .. . .... 841 Bloqueo optimista. . . . . . . . .. .847 ReadWriteLocks . . . . . ................ 848
Objetos activos ................. . ...... 850 Resumen ..................... . . . ...... 853
Lecturas adicionales . ...... . . . .. . ..... 855
22 Interfaces grficasde usuario ... .. . . . . ... 857 Applets . . ........ .................. ..... 858 Fundamentos de Swing ..... ... . .......... 859
Un entorno de visuali zacin . .. .. ....... 86 1 Definicin de un botn ............ ..... 862 Captura de un suceso ............... . ..... 862 reas de texto ....... .... ...... . ...... 864 Control de la disposicin ................. 865
BorderLayout . ............. .. ............ 866 "lowLayout. .. .. . .. .. . .. . . . .. .. .. .. .. . . 867 GridLayout . . Grid.BagLayout. .. Posicionamiento absoluto BoxLayout. ........ .
.867 .. . .... .. .... ..... 868 ........ .. .... ... 868 . ... .. . . . . . ..... 868
Cul es la mejor solucin? . ....... ... ..... 868 ........... 868 El modelo de sucesos de Swing
Tipos de sucesos y de escuchas Control de mltiples sucesos .....
Una seleccin de componentes Swing Botones.
... 869 .874
....... 876 . .... 876
Iconos . ........ . . . . . . . . . .. . . .. . . . . . .878 .880 .880
Sugerencias Campos de texto Bordes Un mini-editor. Casillas de verificacin
.88 1 .... 882 ... 883
Botones de opcin. . . . . ...... 884 Cuadros combinados (listas desplegables) ...... 885 Cuadros de lista. . ..... 886
Tableros con fichas . . . . . . . . . . . . . . . . . .. . 887 Recuadros de mensaje . ... . ............ ..... 888 Mens. . . .... .. . . . ........ . . . 890 Mens emergentes. Dibujo ..... . Cuadros de dilogo ... Cuadros de dilogo de archivos HTML en los componentes Swing Deslizadores y barras de progreso
894 ..895
. .. .... .... 898 .... 901 .... 902
..... 903 Seleccin del aspecto y del estilo . 904 rboles, tablas y portapapeles . . . . . ... . . .. 906
JNLP Y Java Web Start .................... 906 Concurrencia y Swing . ....... . . . . . . .. . .... 9 10
Tareas de larga duracin .... . ....... .. ...... 910 Hebras visuales. . . . ............... 916
Programacin visual y componentes JavaBean . 9 18 Qu es un componenle JavaBean? . .... . .. .. . 919 Extraccin de la informacin Beanlnfo con
lntrospector ... Una Bean ms sofisticada . ... Sincronizacin en JavaBeans Empaquetado de una Bean . ......... .
...920 .. ... .. 924
. . . . 927
. ... 930 Soporte avanzado de componentes Bean . .... . . 931 Ms informacin sobre componentes Bean. . .932
Alternativas a Swing . ................. .... 932 Construccin de clientes web Flash con Flex .. 932
Helio, Flex ............................... 932 Compilacin de MXML. . . . . ..... 933 MXML y ActionScript . .................... . 934 Contenedores y controles. . . . . ..... . 935 Efectos y estilos Sucesos . . Conexin con Java.
.936 . . ...... ... . 937 ........... 93 7
Modelos de datos y acoplamiento de datos .. . . . . 939 Construccin e implantac in de aplicaciones . ... 940
Creacin de aplicaciones SWT ........ .941 Instalacin de SWT . . . . . . . . . . . . . . . . . . . . . 941 Helio, SWT .. .. .... . .. .. 94 1 Eliminacin del cdigo redundante. . . . . 944 Mens . ................. ....... ....... ... 945 Paneles con fichas, botones y sucesos events . ... 946 Grficos . ............ . . ........ .. 949 Concurrencia en SWT ... .. 950 SWT o Swing? . . . . . . .. . . .. . . . . ......... 952
Resumen ......... . . ... . . . . . . . . . ... . .... 952 Recursos .... . .. ... . . . . .. ... .. . . ... . . ... . 953
A Suplementos ..................... . .... 955 Suplementos descargables ......... . Thinking in C: fundamentos para Java ..
.... 955
. . . . 955 Seminario ThinJ..ing in Java . . . . . . . . . . . . . . 955 Seminario CD Hallds-On Java .... 956 Seminario Thinking in Objects ........ .... 956 Thinking in Entelprise Java . ....... . . .. ... . 956 Thinking in Patlerns (con Java) ............. 957 Seminario Thinking in Patterns Consultora y revisin de diseo
... 957 .... 957
Contenido xvii
B Recursos ...... .. .......... . .... .... .. 959 Software ............. .... ... ... . Editores y entornos !DE ..... . ... ... . Libros ........... .
Anlisis y diseo . .. Python . ........ .
... 959
... 959
... 959 .. ... 960 .. .. 962
Mi propia lista de libros . . . . . . . . . ... 962
Indice ............ .. .. ... . . . .... . .... . 963
Prefacio
Originalmente, me enfrent a Java como si fuera "simplemente otro lenguaje ms de programacin", 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 dems lenguajes que haba visto hasta el momento . La tarea de programacin se basa en gestionar la complejidad: la complejidad del problema que se quiere resolver, sumada a la complej idad de la mquina en la cual hay que resolverlo. Debido a esta complejidad, la mayora de los proyectos de programacin terminan fallando. A pesar de lo cual, de todos los lenguajes de programacin que conozco, casi ninguno de ellos haba adoptado como principal objetivo de diseo resolver la complej idad inherente al desarrollo y el mantenimiento de los programas. 1 Por supuesto, muchas decisiones del diseo 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 programadores terminen no pudiendo cumplir el objetivo principalmente con esos lenguajes. Por ejemplo, C++ tena que ser compatible en sentido descendente con C (para permitir una fcil migracin a los programadores de C), adems de ser un lenguaje eficiente. Ambos objetivos resultan muy tiles y explican parte del xito de C++, pero tambin aaden 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 haba sido diseado para ser un lenguaje extensible, por lo que todas las extensiones aadidas a VB han dado como resultado una sintaxis verdaderamente inmanejable. Ped es compatible en sentido descendente con awk, sed, grep y otras herramientas Unix a las que pretenda sustituir, y como resultado, se le acusa a menudo de generar "cdi-go de slo escritura" (es decir, despus de pasado un tiempo se vuelve completamente ilegible) . Por otro lado, C++, VB, Ped y otros lenguajes como Smalltalk han centrado algo de esfuerzo de diseo en la cuestin de la complejidad, y como resultado, ha tenido un gran xito a la hora de resolver ciertos tipos de problemas.
Lo que ms me ha impresionado cuando he llegado a entender el lenguaje Java es que dentro del conjunto de objetivos de diseo establecido por Sun, parece que se hubiera decidido tratar de reducir la complejidad para el programador. Como si quienes marcaron esos objetivos hubieran dicho: "Tratemos de reducir el tiempo y la dificultad necesarios para generar cdi-go robusto" . Al principio, este objetivo daba como resultado un cdigo que no se ejecutaba especialmente rpido (aunque esto ha mejorado a lo largo del tiempo), pero desde luego ha permitido reducir considerablemente el tiempo de desarrollo, que es inferior en un 50 por ciento o incluso ms al tiempo necesario para crear un programa en c ++ equivalente. Simplemente por esto, ya podemos ahorrar cantidades enormes de tiempo y de dinero, pero Java no se detiene ah, sino que trata de hacer transparentes muchas de las complejas tareas que han llegado a ser importantes en el mundo de la programa-cin, como la utilizacin de mltiples hebras o la programacin de red, empleando para conseguir esa transparencia una serie de caractersticas del lenguaje y de bibliotecas preprogramadas que pueden hacer que muchas tareas lleguen a resultar sencillas. Finalmente, Java aborda algunos problemas realmente complejos: programas interplataforma, cambios de cdigo dinmicos e incluso cuestiones de seguridad, todos los cuales representan problemas de una complejidad tal que pueden hacer fracasar proyectos completos de programacin. 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 comunicacin entre las personas en todos los sentidos: a la hora de crear 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
I Sin embargo, creo que el lenguaje Python es el que ms se acerca a ese objetivo. Consulte www.Python. OIg.
xx Piensa en Java
ejecutar los programas en diferentes tipos de mquinas y a la hora de escribir con sencillez aplicaciones que se comuniquen a travs de Internet.
En mi opinin, los resultados de la revolucin de las comunicaciones no se percibirn a partir de los efectos de desplazar grandes cantidades de bits de un sitio a otro, sino que seremos conscientes de la verdadera revolucin a medida que veamos cmo podemos comunicamos con los dems de manera ms sencilla, tanto en comunicaciones de persona a persona, como en grupos repartidos por todo el mundo. Algunos sugieren que la siguiente revolucin ser la formacin de una especie de mente global derivada de la interconexin de un nmero suficiente de personas. No s si Java llegar a ser la herramienta que fomente dicha revolucin, pero esa posibilidad me ha hecho sentir, al menos, que estoy haciendo algo importante al tra-tar de ensear este lenguaje.
Java SES Y SE6 Esta edicin del libro aprovecha en buena medida las mejoras realizadas al lenguaje Java en 10 que Sun originalmente deno-min JDK 1.5 Y cambi posteriormente a JDK5 o J2SE5 . Posteriormente, la empresa elimin el obsoleto "2" y cambi el nombre a Java SE5. Muchos de los cambios en el lenguaje Java SE5 fueron decididos para mejorar la experiencia de uso del programador. Como veremos, los diseadores del lenguaje Java no obtuvieron un completo xito en esta tarea, pero en general dieron pasos muy significativos en la direccin correcta.
Uno de los objetivos ms importantes de esta edicin es absorber de manera completa las mejoras introducidas por Java SE5/6, presentarlas y emplearlas a lo largo de todo el texto. Esto quiere decir que en esta edicin se ha tomado la dura deci-sin de hacer el texto nicamente compatible con Java SE5/6, por lo que buena parte del cdigo del libro no puede compi-larse con las versiones anteriores de Java; el sistema de generacin de cdigo dar errores y se detendr si se intenta efectuar esa compilacin. A pesar de todo, creo que los beneficios de este enfoque compensan el riesgo asociado a dicha decisin.
Si el lector prefiere por algn motivo las versiones anteriores de Java, se puede descargar el texto de las versiones anterio-res de este libro (en ingls) en la direccin www.MindView.net. Por diversas razones, la edicin actual del libro no est en formato electrnico gratuito, sino que slo pueden descargarse las ediciones anteriores.
Java SE6 La redaccin de este libro ha sido, en s misma, un proyecto de proporciones colosales y al que ha habido que dedicar much-simo tiempo. Y antes de que el libro fuera publicado, la versin Java SE6 (cuyo nombre en clave es mustang) apareci en versin beta. Aunque hay unos cuantos cambios de menor importancia en Java SE6 que mejoran algunos de los ejemplos incluidos 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 versin se centran en el anmento de la velocidad y en determinadas funcionalidades de biblioteca que caan fuera del alcance del texto.
El cdigo incluido 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 algn cambio importante a la hora de lanzar oficialmente JavaSE6, ese cambio se ver reflejado en el cdigo fuente del libro, que puede descargarse desde www.MindView.net.
En la portada del libro se indica que este texto es para "Java SE5/6", lo que significa "escrito para Java SE5 teniendo en cuenta los significativos cambios que dicha versin ha introducido en el lenguaje, pero siendo el texto igualmente aplicable a Java SE6".
La cuarta edicin La principal satisfaccin a la hora de realizar una nueva edicin de un libro es la de poder "corregir" el texto, aplicando todo aquello que he podido aprender desde que la ltima edicin 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-cin del libro constituye siempre una oportunidad de corregir errores o hacer ms amena la lectura. Asimismo, a la hora de abordar una nueva edicin vienen a la mente nuevas ideas fascinantes y la posibilidad de cometer nuevos errores se ve ms que compensada por el placer de descubrir nuevas cosas y la capacidad de expresar las ideas de una forma ms adecuada.
Prefacio xxi
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 estn 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 ms fieles.
Cambios El CD-ROM que se haba incluido tradicionalmente como parte del libro no ha sido incluido en esta edicin. La parte esen-cial de dicho CD, el seminario multimedia Thinking in e (creado para MindView por Chuck Allison), est ahora disponible como presentacin Flash descargable. El objetivo de dicho seminario consiste en preparar a aquellos que no estn lo sufi-cientemente familiarizados con la sintaxis de C, de manera que puedan comprender mejor el material presentado en este libro. Aunque en dos de los captulos 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 presentacin Thinking in e trata de ayudar a dichas personas a alcanzar el nivel necesario.
El captulo dedicado a la concurrencia, que antes llevaba por ttulo "Programacin multihebra", ha sido completamente rees-crito con el fin de adaptarlo a los cambios principales en las bibliotecas de concurrencia de Java SE5, pero sigue proporcio-nando informacin bsica sobre las ideas fundamentales en las que la concurrencia se apoya. Sin esas ideas fundamentales, resulta dificil comprender otras cuestiones ms complejas relacionadas con la programacin multihebra. He invertido muchos meses en esta tarea, inmerso en ese mundo denominado "concurrencia" y el resultado final es que el captulo no slo proporciona los fundamentos del tema sino que tambin se aventura en otros territorios ms novedosos.
Existe un nuevo captulo dedicado a cada una de las principales caractersticas nuevas del lenguaje Java SE5, y el resto de las nuevas caractersticas han sido reflejadas en las modificaciones realizadas sobre el material existente. Debido al estudio continuado que realizo de los patrones de diseo, tambin se han introducido en todo el libro nuevos patrones.
El libro ha sufrido una considerable reorganizacin. Buena parte de los cambios se deben a razones pedaggicas, junto con la perfeccin de que quiz mi concepto de "captulo" necesitaba ser revisado. Adicionalmente, siempre he tendido a creer que un tema tena que tener "la suficiente envergadura" para justificar el dedicarle un captulo. Pero luego he visto, espe-cialmente a la hora de ensear los patrones de diseo, que las personas que asistan a los seminarios obtenan mejores resul-tados si se presentaba un nico patrn y a continuacin se haca, inmediatamente, un ejercicio, incluso si eso significaba que yo slo hablara durante un breve perodo de tiempo (asimismo, descubr que esta nueva estructura era ms agradable para el profesor). Por tanto, en esta versin del libro he tratado de descomponer los captulos segn los temas, sin preocuparme de la longitud final de cada captulo. Creo que el resultado representa una autntica mejora. Tambin he llegado a comprender la enorme importancia que tiene el tema de las pruebas de cdigo. Sin un marco de prue-bas predefinido, con una serie de pruebas que se ejecuten cada vez que se construya el sistema, no hay forma de saber si el cdigo es fiable o no. Para conseguir este objetivo en el libro, he creado un marco de pruebas que permite mostrar y vali-dar la salida de cada programa (dicho marco est escrito en Python, y puede descargarse en www.MindVew.net. El tema de las pruebas, en general, se trata en el suplemento disponible en http://www.MindVew.net/Books/BetterJava. que presenta lo que creo que son capacidades fundamentales que todos los programadores deberan tener como parte de sus conocimientos bsicos.
Adems, he repasado cada uno de los ejemplos del libro preguntndome a m mismo: "Por qu lo hice de esta manera?" . En la mayora de los casos, he realizado algunas modificaciones y mejoras, tanto para hacer los ejemplos ms coherentes entre s, como para demostrar lo que considero que son las reglas prcticas de programacin en Java, (al menos dentro de los lmites de un texto introductorio). Para muchos de los ejemplos existentes, se ha realizado un rediseo y una nueva implementacin con cambios significativos con respecto a las versiones anteriores. Aquellos ejemplos que me pareca que ya no tenan sentido han sido eliminados y se han aadido, asimismo, nuevos ejemplos. Los lectores de las ediciones anteriores han hecho numerossimos comentarios muy pertinentes, lo que me llena de satisfac-cin. Sin embargo, de vez en cuando tambin me llegan algunas quejas y, por alguna razn, tilla de las ms frecuentes es que "este libro es demasiado voluminoso". En mi opinin, si la nica queja es que este libro tiene "demasiadas pginas", creo que el resultado global es satisfactorio (se me viene a la mente el comentario de aquel emperador de Austria que se quejaba de la obra de Mozart diciendo que tena "demasiadas notas"; por supuesto, no trato en absoluto de compararme con Mozart). Adems, debo suponer que ese tipo de quejas proceden de personas que todava no han llegado a familiarizarse con la enorme variedad de caractersticas del propio lenguaje Java y que no han tenido ocasin de consultar el resto de libros dedicados a este tema. De todos modos, una de las cosas que he tratado de hacer en esta edicin es recortar aquellas partes
xxii Piensa en Java
que han llegado a ser obsoletas, o al menos, no esenciales. En general, se ha repasado todo el texto eliminando lo que ya haba 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 cOlTespondiente contina estando en el sitio web (www.MindVew.net).graciasa laversindescargabledelastresprimerasedicionesdel libro.Asimismo. el lector tiene a su disposicin material adicional en suplementos descargables de esta edicin.
En cualquier caso, para aquellos lectores que sigan considerando excesivo el tamao del libro les pido disculpas. Lo crean o no, he hecho cuanto estaba en mi mano para que ese tamao fuera el menor posible.
Sobre el diseo de la cubierta La cubierta del libro est inspirada por el movimiento American Arts & Crafls Movement que comenz poco antes del cam-bio de siglo y alcanz su cenit entre 1900 y 1920. Comenz en Inglaterra como reaccin a la produccin en masa de la revo-lucin industrial y al estilo altamente ornamental de la poca victoriana. Arts & Crafls enfatizaba el diseo con formas naturales, como en el movimiento art nOllveau, como el trabajo manual y la importancia del artesano, sin por ello renunciar al uso de herramientas modernas. Existen muchos ecos con la situacin que vivimos hoy en da: el cambio de siglo, la evo-lucin desde los rudimentarios comienzos de la revolucin informtica hacia algo ms refinado y significativo y el nfasis en la artesana del software en lugar de en su simple manufactura.
La concepcin de Java tiene mucho que ver con este punto de vista. Es un intento de elevar al programador por encima del sistema operativo, para transformarlo en un "artesano del software".
Tanto el autor de este libro como el diseador de la cubierta (que son amigos desde la infancia) han encontrado inspiracin en este movimiento, ambos poseemos muebles, lmparas y otros objetos originales de este perodo o inspirados en el mismo. El otro tema de la cubierta sugiere una vitrina coleccionista que un naturalista podra emplear para mostrar los especrnenes de insectos que ha preservado. Estos insectos son objetos situados dentro de los objetos compartimento. Los objetos com-partimento estn a su vez, colocados dentro del "objeto cubierta", lo que ilustra el concepto de agregacin dentro de la pro-gramacin orientada a objetos. Por supuesto, cualquier programador de habla inglesa efectuar enseguida entre los insectos "bugs" y los errores de programacin (tambin bugs). Aqu, esos insectos/errores han sido capturados y presumiblemente muertos en un tarro y confinados fmalmente dentro de una vitrina, con lo que tratamos de sugerir la habi lidad que Java tiene para encontrar, mostrar y corregir los errores (habilidad que constituye uno de sus ms potentes atributos). En esta edicin, 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 consultora y desarrollar proyectos pedaggicos: Dave Bartlett, Bill Venners, Chuck AIlison, Jeremy Meyer y Jamie King. Agradezco la paciencia que mostris mientras contino 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 nmero sorprendentemente grande de personas que me ayudan en mi trabajo, usualmente trabajando desde sus propias oficinas. En el pasado, yo ten-dra que haber adquirido o alquilado una gran oficina para que todas estas personas pudieran trabajar, pero gracias a Internet, a los servicios de mensajeros y al telfono, ahora puedo contar con su ayuda sin esos costes adicionales. Dentro de mis inten-tos por aprender a "trabajar eficazmente con los dems", todos vosotros me habis ayudado enormemente y espero poder continuar aprendiendo a mejorar mi trabajo gracias a los esfuerzos de otros. La ayuda de Paula Steuer ha sido valiossima a la hora de tomar mis poco inteligentes prcticas empresariales y transformarlas en algo razonable (gracias por ayudarme cuando no quiero encargarme 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 escorpin, hacindonos marchar disciplinadamente a travs 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 autntica experta en edicin de sonido y ha sido una de las personas esen-ciales a la hora de crear los cursos de formacin multimedia, adems de ayudar en la resolucin de muchos otros proble-mas. Gracias por la perseverancia que has demostrado a la hora de enfrentarte con problemas informticos complejos. La gente de Amaio en Praga tambin ha sido de gran ayuda en numerosos proyectos. Daniel Will-Harris fue mi primera fuen-
Prefacio xxiii
te de inspiracin en lo que respecta al proyecto de trabajo a travs de Internet y tambin ha sido imprescindible, por supues-to, en todas las soluciones de diseo grfico que he desarrollado.
A lo largo de los aos, a travs 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 numerosas correcciones tcnicas para la cuarta edicin, aunque tambin hay otras personas que han ayudado en esta tarea, con diversos captulos y ejemplos. Ervin ha sido el revisor tcnico principal del libro y tam-bin se encarg de escribir la gua de soluciones para la cuarta edicin. Los errores detectados por Ervin y las mejoras que l ha introducido en el libro han permitido redondear el texto. Su minuciosidad y su atencin al detalle resultan sorprenden-tes y es, con mucho, el mejor revisor tcnico que he tenido. Muchas gracias, Ervin. Mi weblog en la pgina www.Artima.com de Bill Venners tambin 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-tores debo citar a James Watson, Howard Lovatt, Michael Barker, y a muchos otros que no menciono por falta de espacio, en particular a aquellos que me han ayudado en el tema de los genricos.
Gracias a Mark Welsh por su ayuda continuada.
Evan Cofsky contina siendo de una gran ayuda, al conocer de memoria todos los arcanos detalles relativos a la configura-cin y mantenimiento del servidor web basados en Linux, as 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. Camp4 Coffee en Crested Butte, Colorado, ha llegado a ser el lugar de reunin normal cada vez que alguien vena 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 ms interesante y placentero. Gracias tambin 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.cygwin.com) me ha permitido resolver innumerables problemas que Windows no puede resolver y cada da que pasa ms me engancho a esta herramienta (me hubiera encantado disponer de ella hace 15 aos, cuando tena mi mente orientada a Gnu Emacs). Eclipse de IBM (www.eclipse.org) representa una mara-villosa contribucin a la comunidad de desarrolladores y cabe esperar que se puedan obtener grandes cosas con esta herra-mienta a medida que vaya evolucionando. JetBrains IntelliJ Idea contina 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 rpidamente en mi herramienta UML favorita. El formateador de cdigo Jalopy de Marco Hunsicker (www.triemax.com) tambin ha resultado muy til en numerosas ocasiones y Marco me ha ayudado extraordinariamente a la hora de configurarlo para mis necesidades concre-tas. En mi opinin, la herramienta JEdit de Slava Pestov y sus correspondientes plug-ins tambin resultan tiles en diversos momentos (wwwjedit.org); esta herramienta es un editor muy adecuado para todos aquellos que se estn iniciando en el desarrollo de seminarios.
y por supuesto, por si acaso no lo he dejado claro an, 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 das (a Tim Peters me gustara decirle que he enmarcado ese ratn que tom prestado, al que le he dado el nombre oficial de "TimBotMouse") . Permitidme tan slo recomendaros que busquis otros lugares ms 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 llegar sus correcciones y estoy en deuda con todas ellas, pero quiero dar las gra-cias en particular a (por la primera edicin): Kevin Raulerson (encontr numerossimos errores imperdonables), Bob Resendes (simplemente increble), John Pinto, Joe Dante, loe Sharp (fabulosos vuestros comentarios), David Combs (mune-rosas correcciones de clarificacin y de gramtica), Dr. Robert Stephenson, lohn Cook, Franklin Chen, Zev Griner, David Karr, Leander A. Strosehein, Steve Clark, Charles A. Lee, Austin Maher, Dennis P. Roth, Roque Oliveira, Douglas Dunn, Dejan Ristic, N eil Galarneau, David B. Malkovsky, Steve Wilkinson, y muchos otros. El Profesor Mare Meurrens dedic
xxiv Piensa en Java
una gran cantidad de esfuerzo a pub licitar y difundir la versin electrnica de la primera edicin 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 edicin), as como a los que han proporcionado otros tipos de comentarios: Jan 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 edicin, Chris Grindstaff result de gran ayuda durante el desarrollo de la seccin SWT y Sean Neville escri-bi para m el primer borrador de la seccin dedicada a Flex.
Kraig Brockschmidt y Gen Kiyooka son algunas de esas personas inteligentes que he podido conocer en alglm momento de vida y que han llegado a ser autnticos amigos, habiendo tenido una enorme influencia sobre m. 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 sorprendente que el saber de Delphi me ayudara a comprender Java, ya que ambos lenguajes tienen en comn muchos conceptos y decisiones relativas al diseo del lenguaje. Mis amigos de Delphi me ayudaron enormemente a la hora de entender mejor ese maravilloso entorno de programacin. Se trata de Marco Cantu (otro italiano, quiz el ser educado en latn mejora las aptitudes de uno para los lenguajes de programacin), Neil Rubenking (que sola dedicarse al yoga, la comi-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 magnfico Anders Hejlsberg, que contina asombrndonos 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 los de Kim) me han sido de gran ayuda. Richard y yo hemos pasado muchos meses juntos impartiendo seminarios y tratando de mejorar los aspectos pedaggicos con el fin de que los asistentes disfrutaran de una experiencia perfecta.
El diseo del libro, el diseo de la cubierta y la fotografia de la cubierta han sido realizados por mi amigo Daniel Will-Harris, renombrado autor y diseador (www.Will-Harris.com). que ya sola crear sus propios diseos en el colegio, mientras espe-raba a que se inventaran las computadoras y las herramientas de autoedicin, y que ya entonces se quejaba de mi forma de resolver los problemas de lgebra. Sin embargo, yo me he encargado de preparar para imprenta las pginas, por lo que los errores de fotocomposicin son mos. He utilizado Microsoft Word XP para Windows a la hora de escribir el libro y de preparar las pginas para imprenta mediante Adobe Acrobat; este libro fue impreso directamente a partir de los archivos Acrobat PDF. Como tributo a la era electrnica yo me encontraba fuera del pas en el momento de producir la primera y la segunda ediciones finales del libro; la primera edicin fue enviada desde Ciudad del Cabo (Sudfrica), mientras que la segunda edicin fue enviada desde Praga. La tercera y cuarta ediciones fueron realizadas desde Crested Butte, Colorado. En la versin en ingls del libro se utiliz el tipo de letra Ceorgia para el texto y los ttulos estn en Verdana. La letra de la cubierta original es Te Rennie Mackintosh.
Gracias en especial a todos mis profesores y estudiantes (que tambin son mis profesores). Mi gato Molly sola sentarse en mi regazo mientras trabajaba en esta edicin, ofrecindome as mi propio tipo de apoyo peludo y clido.
Entre los amigos que tambin me han dado su apoyo, y a los que debo citar (aunque hay muchos otros a los que no cito por falta de espacio), me gustara destacar a: Patty Gast (extraordinaria masaj ista), Andrew Binstock, Steve Sinofsky, JD Hildebrandt, Tom Keffer, Brian McElhinney, BrinkJey Barr, Bill Gates en Midnight Engineering Magazine, Larry Constantine y Lucy Lockwood, Gene Wang, Dave Mayer, David Intersimone, Chris y Laura Sttand, Jos Almquists, Brad Jerbic, Marilyn Cvitanic, Mark Mabry, la familia Robbins, la familia Moelter (y los McMillans), Michael Wilk, Dave Stoner, los Cranstons, Larry Fogg, Mike Sequeira, Gary Entsminger, Kevin y Sonda Donovan, Joe Lordi, Dave y Brenda Bartlett, Patti Gast, Blake, Annette & Jade, los Rentschlers, los Sudeks, Dick, Patty, y Lee Eckel, Lynn y Todd, y sus familias. Y por supuesto, a mam y pap.
I ntrod uccin
"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 ... eslamos, en buena medida, a merced del lenguaje concreto que nuestra sociedad haya elegido como medio de expresin. Resulta completamente ilusorio creer que nos ajustamos a la realidad esencialmente sin utilizar el lenguaje y que el lenguaje es meramente un medio incidental de resolver problemas especficos de comunicacin y reflexin. Lo cierto es que e/ "mundo real" est en gran parle construido, de manera inconsciente, sobre los hbi-tos lingsticos del grupo.
El estado de la Lingstica como ciencia, 1929, Edward Sapir
Como cualquier lenguaje humano, Java proporciona una forma de expresar conceptos. Si tiene xito, esta forma de expre-sin ser significativamente ms fcil y flexible que las alternativas a medida que los problemas crecen en tamao y en com-plejidad. No podemos ver Java slo como una coleccin de caractersticas, ya que algunas de ellas no tienen sentido aisladas. Slo se puede emplear la suma de las partes si se est pensando en el diseo y no simplemente en la codificacin. Y para enten-der Java as, hay que comprender los problemas del lenguaje y de la programacin en general. Este libro se ocupa de los problemas de la programacin, porque son problemas, y del mtodo que emplea Java para resolverlos. En consecuencia, el conjunto de caractersticas que el autor explica en cada captulo se basa en la forma en que l ve cmo puede resolverse un tipo de problema en particular con este lenguaje. De este modo, el autor pretende conducir, poco a poco, al lector hasta el punto en que Java se convierta en su lengua materna.
La actitud del autor a lo largo del libro es la de conseguir que el lector construya un modelo mental que le permita desarro-llar un conocimiento profundo del lenguaje; si se enfrenta a un puzzle, podr fijarse en el modelo para tratar de deducir la respuesta.
Prerrequisitos Este libro supone que el lector est familiarizado con la programacin: sabe que un programa es una coleccin de instruc-ciones, qu es una subrutina, una funcin o una macro, conoce las instrucciones de control como "if' y las estructuras de bucle como "while", etc. Sin embargo, es posible que el lector haya aprendido estos conceptos en muchos sitios, tales como la programacin con un lenguaje de macros o trabajando con una herramienta como Perl. Cuando programe sintindose cmodo con las ideas bsicas de la programacin, podr abordar este libro. Por supuesto, el libro ser ms fc il para los pro-gramadores de C y ms todava para los de C++, pero tampoco debe autoexcluirse si no tiene experiencia con estos lengua-jes (aunque tendr que trabajar duro). Puede descargarse en www.MindView.net el seminario muJtimedia Thinking in e, el cual le ayudar a aprender ms rpidamente los fundamentos necesarios para estudiar Java. No obstante, en el libro se abor-dan los conceptos de programacin orientada a objetos (POO) y los mecanismos de control bsicos de Java. Aunque a menudo se hacen referencias a las caractersticas de los lenguajes C y C++ no es necesario profundizar en ellos, aunque s ayudarn a todos los programadores a poner a Java en perspectiva 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+ + (Osbome/McGraw-I-lill, 1989), comenc a ensear dicho lenguaje. Ensear lenguajes de programacin se convirti en mi profesin; desde 1987 he visto en auditorios de todo el mundo ver dudar a los asistentes, he visto asimismo caras sorprendidas y expresiones de incredulidad. Cuando empec a impartir cursos de formacin a grupos pequeos, descubr algo mientras se hacan ejercicios. Incluso aquellos que sonrean se quedaban con dudas sobre muchos aspectos. Comprend al dirigir durante una serie de aos la sesin de C++ en la Software Development Conference (y ms tarde la sesin sobre Java), que tanto yo como otros oradores tocbamos dema-siados temas muy rpidamente. 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. Quiz es pedir demasiado pero dado que soy uno de esos que se resisten a las conferencias tradicionales (yen la mayora de los casos, creo que esa resistencia proviene del aburrimiento), quera inten-tar algo que permitiera tener a todo el mundo enganchado.
Durante algn tiempo, cre varias presentaciones diferentes en poco tiempo, por lo que termin aprendiendo segn el mto-do de la experimentacin e iteracin (una tcnica que tambin funciona en el diseo de programas). Desarroll un curso uti-lizando todo lo que haba aprendido de mi experiencia en la enseanza. Mi empresa, MindView, Inc. , ahora imparte el seminario Thinking in Java (piensa en Java); que es nuestro principal seminario de introduccin que proporciona los funda-mentos para nuestros restantes seminarios ms avanzados. Puede encontrar informacin detallada en www.MindView.net. El seminario de introduccin tambin est disponible en el CD-ROM Hands-On Java. La informacin se encuentra disponible en el mismo sitio web.
La respuesta que voy obteniendo en cada seminario me ayuda a cambiar y reenfocar el material hasta que creo que funcio-na bien como mtodo de enseanza. Pero este libro no son slo las notas del seminario; he intentado recopilar el mximo de informacin posible en estas pginas y estructurarla de manera que cada tema lleve al siguiente. Ms que cualquier otra cosa, el libro est diseado para servir al lector solitario que se est enfrentando a un nuevo lenguaje de programacin.
Objetivos Como mi anterior libro, Thinking in C+ +, este libro se ha diseado con una idea en mente: la forma en que las personas aprenden un lenguaje. Cuando pienso en un captulo del libro, pienso en trminos de qu hizo que fuera una leccin duran-te un seminario. La infonnacin que me proporcionan las personas que asisten a un seminario me ayuda a comprender cu-les son las partes complicadas que precisan una mayor explicacin. En las reas en las que fui ambicioso e inclu demasiadas caractersticas a un mismo tiempo, pude comprobar que si inclua muchas caractersticas nuevas, tena que explicarlas yeso contribua fcilmente a la confusin del estudiante.
En cada captulo he intentado ensear una sola caracterstica o un pequeo grupo de caractersticas asociadas, sin que sean necesarios conceptos que todava no se hayan presentado. De esta manera, el 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 fcilmente antes de pasar a la siguien-
te. Secuenciar cuidadosamente la presentacin de las caractersticas, 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 proporciona una breve descripcin introductoria.
2. Utilizar ejemplos que sean tan simples y cortos como sea posible. Esto evita en ocasiones acometer problemas del "mundo real", pero he descubierto que los principiantes suelen estar ms contentos cuando pueden compren-der todos los detalles de un ejemplo que cuando se ven impresionados por el mbito del problema que resuelve. Tambin, existe una seria limitacin en cuanto a la cantidad de cdigo que se puede absorber en el aula. Por esta razn, no dudar en recibir crticas acerca del uso de "ejemplos de juguete", sino que estoy deseando recibirlas en aras de lograr algo pedaggicamente til.
3. Dar lo 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 jerarqua de importancia de la informacin y que existen hechos que el 95% de los progra-madores nunca conocern, detalles que slo sirven para confundir a las personas y que incrementan su percep-cin de la complejidad del lenguaje. Tomemos un ejemplo de C, si se memoriza la tabla de precedencia de los
Introduccin xxvii
operadores (yo nunca lo he hecho), se puede escribir cdigo inteligente. Pero si se piensa en ello, tambin con-fundir la lectura y el mantenimiento de dicho cdigo, por tanto, hay que olvidarse de la precedencia y emplear parntesis cuando las cosas no estn claras.
4. Mantener cada seccin enfocada de manera que el tiempo de lectura y el tiempo entre ejercicios, sea pequeo. Esto no slo mantiene las mentes de los alumnos ms activas cuando se est en un seminario, sino que tambin proporciona al lector una mayor sensacin de estar avanzando.
5. Proporcionar al alumno una base slida de modo que pueda comprender los temas los suficientemente bien como para que desee acudir a cursos o libros ms avanzados.
Ensear con este libro La edicin 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 creciendo y aadiendo ms y ms fun-cionalidades y bibliotecas, yo tenazmente trataba de ensearlo todo en una semana. En una ocasin, un cliente me sugiri que enseara "slo los fundamentos" y al hacerlo descubr que tratar de memorizar todo en una nica semana era angustio-so tanto para m como para las personas que asistan al seminario. Java ya no era un lenguaje "simple" que se poda apren-der en una semana.
Dicha experiencia me llev a reorganizar este libro, el cual ahora est diseado como material de apoyo para un seminario de dos semanas o un curso escolar de dos trimestres. La parte de introduccin termina con el Captulo 12, Tratamiento de errores mediante excepciones, aunque tambin puede complementarla con una introduccin a IDBC, Servlets y JSP. Esto proporciona las bases y es el ncleo del CD-ROM Hands-On Java. El resto del libro se corresponde con un curso de nivel intennedio y es el material cubierto en el CD-ROM Intermediale Thinking in Java. Ambos discos CD ROM pueden adqui-rirse a travs de wl:vw.MindView.net. Contacte con Prentice-Hall en www.prenhallprofessional. com para obtener ms informacin acerca del material para el pro-fesor relacionado con este libro.
Documentacin del JDK en HTML El lenguaje Java y las bibliotecas de Sun Microsystems (descarga gratuita en hllp://java.sun. com) se suministran con docu-mentacin en formato electrnico, que se puede leer con un explorador web. Muchos de los libros publicados sobre Java proporcionan esta documentacin. Por tanto, o ya se tiene o puede descargase y, a menos que sea necesario, en este libro no se incluye dicha documentacin, porque normalmente es mucho ms rpido encontrar las descripciones de las clases en el explorador web que buscarlas en un libro (y probablemente la documentacin en lnea estar ms actualizada). Basta con que utilice la referencia "JDK documentation". En este libro se proporcionan descripciones adicionales de las clases slo cuando es necesario complementar dicha documentacin, con el fin de que se pueda comprender un determinado ejemplo.
Ejercicios He descubierto que durante las clases los ejercicios sencillos son excepcionalmente tiles para que el alumno termine de comprender el tema, por lo que he incluido al final de cada captulo una serie de ejercicios. La mayor parte de los ejercicios son bastante sencillos y estn diseados para que se puedan realizar durante un tiempo razo-nable de la clase, mientras el profesor observa los progresos, asegurndose de que los estudiantes aprenden el tema. Algunos son algo ms complejos, pero ninguno presenta un reto inalcanzable. Las soluciones a los ejercicios seleccionados se pueden encontrar en el documento electrnico The Thinking in Java Annotated So/ution Guide, que se puede adquirir en www.MindVew.net.
Fundamentos para Java Otra ventaja que presenta esta edicin es el seminario multimedia gratuito que puede descargarse en la direccin www.MindVew.net. Se trata del seminario Thinking in e, el cual proporciona una introduccin a los operadores, funciones
xxviii Piensa en Java
y la sintaxis de e en la que se basa la sintaxis de Java. En las ediciones anteriores del libro se encontraba en el eD Foundations for Java que se proporcionaba junto con el libro, pero ahora este seminario puede descargarse gratuitamente. Originalmente, encargu a ehuck Allison que creara Thinking in C como un producto autnomo, pero decid incluirlo en la segunda edicin 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 a los seminarios sin tener una adecuada formacin en la sintaxis bsica de e. El razonamien-to suele ser: "Soy un programador inteligente y no quiero aprender e, sino e ++ o Java, por tanto, me salto el e y paso direc-tamente a ver el e++/Java". Despus de asistir al seminario, lentamente todo el mundo se da cuenta de que el prerrequisito de conocer la sintaxis de e tiene sus buenas razones de ser.
Las tecnologas han cambiado y han pennitido rehacer Thinking in C como una presentacin Flash descargable en lugar de tener que proporcionarlo en CD. Al proporcionar este seminario en linea, puedo garantizar que todo el mundo pueda comen-zar con una adecuada preparacin.
El seminario Thinking in C tambin permite atraer hacia el libro a una audiencia importante. Incluso aunque los captulos dedicados a operadores y al control de la ejecucin cubren las partes fundamentales de Java que proceden de C, el semina-rio en lnea es una buena introduccin y precisa del estudiante menos conocimientos previos sobre programacin que este libro.
Cdigo fuente Todo el cdigo fuente de este libro est disponible gratuitamente y sometido a copyright, distribuido como un paquete nico, visitando el sitio web www.MindView.net. Para asegurarse de que obtiene la versin ms actual, ste es el sitio oficial de dis-tribucin del cdigo. Puede distribuir el cdigo en las clases y en cualquier otra situacin educativa.
El objetivo principal del copyright es asegurar que el cdigo fuente se cite apropiadamente y evitar as que otros lo publi-quen sin permiso. No obstante, mientras se cite la fuente, no constituye ningn problema en la mayora de los medios que se empleen los ejemplos del libro. En cada archivo de cdigo fuente se encontrar una referencia a la siguiente nota de copyright:
// ,! Copyright.txt Thi s eomputer source eode is Copyright ~2006 MindView, lnc. All Rights Reserved .
Permission to use, eopy, mOdify, and distribute this computer souree code (Source Code) and its documentation without fee and without a wri tten agreement for the purposes set forth be low is hereby granted, provided that the aboye copyright notice, this paragraph and the following five numbered paragraphs appear in a l l copies.
l. Permiss i on is granted to compile the Souree Code and to include the compiled code, in executable format only , in personal and eommereial software programs .
2. Permission is granted to use the Souree Code wi thout modification in classroom situations, including in presentation materials, provided that the book "Thinking in Java 11 is cited as the origino
3. Permission to incorporate the Souree Code into printed media may be obtained by contact i ng :
MindView, lne . 5343 Vall e Vista La Mesa, California 91941 Wayne@MindView . net
4. The Bouree Code and documentation are copyrighted by MindView, lnc. The Souree eode is provided wi thout express
or implied warranty of any kind, including any implied warranty of merchantability, fitness ter a particular purpose or non - infringement . MindView, lnc. does not
Introduccin xxix
warrant that the operation of any program that includes the Sauree Cede will be uninte-rrupted or error - free . MindView, lnc . makes no representation about the suitability of the Bouree Cede or of any software that includes the Sau ree Cede tor any purpose. The entire risk as to the quality and performance of any program that includes the Sauree Cade is with the user of the Sauree Codeo The user understands that the Sauree Cede was developed for research and instructional purposes and is advised not to rely exclusively for any reason on the Source Cede er any p r ogram that includes the Source Codeo Should the Source Cede er any resulting software prove defective, the user as sumes the cost of all necessary servicing, repair, or correction.
5. IN NO EVENT SHALL MINDVIEW, INC . , OR ITS PUBLI SHER BE LI ABLE TO ANY PARTY UNDER ANY LEGAL THEORY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL , OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION , OR ANY OTHER PECUNIARY LOSS, OR FOR PERSONAL I NJURIES, ARISING OUT OF THE USE OF THIS SOURCE CODE AND ITS DOCUMENTATION, OR ARISING OUT OF THE INAB I LI TY TO USE ANY RESULTING PROGRAM , EVEN IF MINDVIEW , INC ., OR I TS PUBLISHER HAS BE EN ADVI SED OF THE POSSIBILITY OF SUCH DAMAGE . MI NDVIEW, INC . SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUD I NG, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY ANO FITNESS FOR A PARTICULAR PURPOSE. THE SOURCE CODE ANO DOCUMENTATION PROVIDED HEREUNDER IS ON AN "AS I S" BAS I S, WI THOUT ANY ACCOMPANYING SERVICES FROM MINDVI EW, I NC . , ANO MINDVIEW, INC. HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODI FICATIONS.
Please note that MindVi e w, lnc. maintains a Web site whi ch is the sole distribution point f or electronic copies of the Source Code, http://www . MindView .net (and official mirror sites), where it i s freely available under the terms stated above .
lf you think you 1ve found an error in the Source Code , please submit a correction u sing the feedback system that you will find at http : //www.MindView . net . /// : -
Puede utilizar el cdigo en sus proyectos y en la clase (incluyendo su material de presentaciones) siempre y cuando se man-tenga la nota de copyright en cada uno de los archivos fuente.
Estndares de codificacin En el texto del libro, los identificadores (nombres de mtodos, variables y clases) se escriben en negrita. La mayora de las palabras clave se escriben en negrita, excepto aquellas palabras clave que se usan con mucha frecuencia y ponerlas en negri-ta podra volverse tedioso, como en el caso de la palabra "e1ass".
En este libro, he utilizado un estilo de codificacin particular para los ejemplos. Este estilo sigue el que emplea Sun en prc-ticamente todo el cdigo que encontrar en su sitio (vase http://java.sun. com/docs/codeconv/index. htmf), y que parece que soporta la mayora de los entornos de desarrollo Java. Si ha ledo mis otros libros, observar tambin que el estilo de codi-ficacin de Sun coincide con el mo, lo que me complace, ya que yo no tengo nada que ver con la creacin del estilo de
xxx Piensa en Java
Sun. El tema del estilo de fonnato es bueno para conseguir horas de intenso debate, por lo que no vaya intentar dictar un estilo correcto a travs de mis ejemplos; tengo mis propias motivaciones para usar el estilo que uso. Dado que Java es un lenguaje de programacin de fonoato libre, se puede emplear el estilo con el que uno se encuentre a gusto. Una solucin para el tema del esti lo de codificacin consiste en utilizar una herramienta como Jalopy (www.triemax.com). la cual me ha ayudado en el desarrollo de este libro a cambiar el fonoato al que se adaptaba a m.
Los archi vos de cdigo impresos en el libro se han probado con un sistema automatizado, por lo que deberan ejecutarse sin crrores de compilacin.
Este libro est basado y se ha comprobado con Java SE5/6. Si necesita obtener infonnacin sobre versiones anteriores del lenguaje que no se cubren en esta ed icin, la ediciones primera y tercera del mismo pueden descargarse gratuitamente en www.MindView.net.
Errores No importa cuantas herramientas uti li ce un escritor para detectar los errores, algunos quedan ah y a menudo son lo que pri-mero ve el lector. Si descubre cualquier cosa que piensa que es un error, por favor utilice el vnculo que encontrar para este libro en www.MindView.net y enveme el error junto con la correccin que usted crea. Cualquier ayuda siempre es bienve-nida.
Introduccin 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 tcito suscrito
por toda nuestra comunidad de hablantes y que est codificado en los propios patrones de nues-tro idioma .. . nos resulta imposible hablar si no utilizamos la organizacin y clasificacin de los
datos decretadas por ese acuerdo". Benjamin Lee Whorf (1 897-1941)
La gnesis de la revolucin de las computadoras se hallaba en una mquina. La gnesis de nuestros lenguajes de programa-cin tiende entonces a parecerse a dicha mquina.
Pero las computadoras, ms que mquinas, pueden considerarse como herramientas que permiten ampliar la mente ("bici-cletas para la mente", como se enorgullece en decir Steve Jobs), adems de un medio de expresin diferente. Como resul-tado, las herramientas empiezan a parecerse menos a mquinas y ms a partes de nuestras mentes, al igual que ocurre con otras formas de expresin como la escritura, la pintura, la escultura, la animacin y la realizacin de pelculas. La progra-macin orientada a objetos (POO) es parte de este movimiento dirigido al uso de las computadoras como un medio de expre-sin. Este captulo presenta los conceptos bsicos de la programacin orientada a objetos, incluyendo una introduccin a los mto-dos de desarrollo. Este captulo, y este libro, supone que el lector tiene cierta experiencia en programacin, aunque no nece-sariamente en C. Si cree que necesita una mayor preparacin antes de abordar este libro, debera trabajar con el seminario multimedia sobre
Top Related