piensa en java 4 edicion

990

Click here to load reader

Upload: luisruiz763

Post on 27-Dec-2015

2.767 views

Category:

Documents


144 download

TRANSCRIPT

  • 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