ES Effective Java, 2nd Edition

369
www.it-ebooks.info

description

ES Effective Java, 2nd Edition

Transcript of ES Effective Java, 2nd Edition

  • www.it-ebooks.info

  • Elogios para la Primera Edicin

    "Claro que quisiera tener este libro hace diez aos. Algunos podran pensar que yo no necesito ningn libro de Java, pero necesito esta. "

    -James Gosling, colega y vicepresidente de Sun Microsystems, Inc., y inventor del lenguaje de programacin Java

    "Un excelente libro, repleto de buenos consejos sobre cmo utilizar el programa de Java- idioma ming y la programacin orientada a objetos en general. "

    -Gilad Bracha, distinguido ingeniero, Cadence Design Systems, y coautor de El Java Especificacin del lenguaje, Tercera Edicin (Addison-Wesley, 2005)

    "10/10-anyone aspiran a escribir buen cdigo Java que otros apreciarn la lectura y el mantenimiento deben estar obligados a poseer una copia de este libro. Este es uno de esos libros raros en los que la informacin no se volver obsoleto con las versiones posteriores de la biblioteca JDK ".

    -Peter Tran, camarero, JavaRanch.com

    "El mejor libro que se haya escrito en Java .... Realmente genial; muy legible y eminentemente til. No puedo decir suficientes cosas buenas sobre este libro. En JavaOne 2001, James Gosling dijo: 'Ve a comprar este libro! "Me alegro de haberlo hecho, y yo no poda estar

    de acuerdo ms ".

    -Keith Edwards, miembro de alto rango del personal de investigacin, Computer Science Lab en el Centro de Investigacin de Palo Alto (PARC), y autor de Core JINI (Prentice Hall, 2000)

    "Este es un verdaderamente excelente libro hecho por el hombre que dise varios de los mejores APIs de la plataforma Java recientes (incluyendo el API Collections). "

    -James Clark, director tcnico del Grupo de Trabajo XML durante la creacin de la Recomendacin XML 1.0; editor de los XPath y XSLT Recomendaciones

    www.it-ebooks.info

  • "Gran contenido. Anlogo al clsico de Scott Meyers Efectiva de C + +. Si conoces los conceptos bsicos de Java, este tiene que ser su prximo libro ".

    -Gary K. Evans, OO mentor y consultor, Evanetics, Inc.

    "Josh Bloch da una gran comprensin de las mejores prcticas que en realidad slo pueden ser

    descu- Ered despus de aos de estudio y experiencia. "

    -Mark Mascolino, ingeniero de software

    "Este es un libro extraordinario. Cubre con claridad muchas de las sutilezas lenguaje / plataforma y el engao que necesita para aprender a convertirse en un verdadero maestro de Java ".

    -Victor Wiewiorowski, desarrollo vicepresidente y gerente de calidad de cdigo, ValueCommerce Co., Tokio, Japn

    "Me gustan los libros que prometer menos en sus ttulos y el exceso de entregar en sus contenidos. Este libro consta de 57 artculos de consejos de programacin que estn bien elegidos. Cada tem revela un claro y profundo conocimiento de la lengua,. Cada uno ilustra en estilo sencillo y prctico trminos de los lmites de la programacin de la intuicin por s sola, o tomar el camino ms directo a una solucin sin entender completamente lo que ofrece el lenguaje ".

    -Michael Ernest, Inkling Research, Inc.

    "Yo no encuentro muchos libros de programacin que me hacen querer leer cada pgina- este es uno de ellos. "

    -Matt Tucker, director tcnico, Jive Software

    "Gran how-to de recursos para el desarrollador experimentado."

    -John Zukowski, autor de numerosos libros de Java

    "Eleg este libro hasta hace dos semanas y puedo decir con seguridad que aprend ms sobre la Lenguaje Java en tres das de la lectura de lo que hice en tres meses de estudio! Un excelente libro y una adicin bienvenida a mi biblioteca Java ".

    -Jane Griscti, I / T asesor especialista

    www.it-ebooks.info

  • Effective Java

    Segunda edicin

    www.it-ebooks.info

  • El Serie Java

    Ken Arnold, James Gosling, David Holmes El lenguaje de programacin Java , Cuarta Edicin

    Joshua Bloch Effective Java Programming Language Guide

    Joshua Bloch Effective Java , Segunda Edicin

    Stephanie Bodoff, Dale Green, Kim Haase, Eric Jendrock El Tutorial J2EE , segunda edicin

    Mara Campione, Kathy Walrath, Alison Huml El Tutorial de Java , tercera edicin: Un Curso Corto en los conceptos bsicos

    Mara Campione, Kathy Walrath, Alison Huml, La Equipo Tutorial El Tutorial de Java Contina: El Resto del JDK

    Patrick Chan El Java Desarrolladores Almanaque 1,4, Volumen 1

    Patrick Chan El Java Desarrolladores Almanaque 1,4, Volumen 2

    Patrick Chan, Rosanna Lee Las bibliotecas de clases de Java , segunda edicin, volumen 2: java.applet, java.awt, java.beans

    Patrick Chan, Rosanna Lee, Doug Kramer Las bibliotecas de clases de Java, Second Edition, Volume 1: Suplemento para la Java 2 Platform, Standard Edition, v1.2

    Eric Jendrock, Jennifer Bola El JavaEE 5 Tutorial, tercera edicin

    Jonni Kanerva El FAQ de Java

    Jonathan Knudsen Kicking Butt con MIDP y MSA: Creando Gran Aplicaciones Mviles

    David Lambert Venta inteligente: Estrategias de Venta Consultiva para satisfacer Necesidades del comprador Cada Hora

    Doug Lea Programacin Concurrente en Java , segunda edicin: Principios y patrones de diseo

    Rosanna Lee, Scott Seligman JNDI API Tutorial y Referencia: Edificio Directorio- Aplicaciones Java activado

    Sheng Liang La interfaz nativa de Java : Gua del programador y Especificacin

    Tim Lindholm, Frank Yellin El Java Virtual Machine Especificacin, segunda edicin

    Roger Riggs, Antero Taivalsaari, Jim Van Peursem, Jyri Huopaniemi, Mark Patel, Aleksi Uotila Programacin de los dispositivos inalmbricos con la Java 2 Platform, Micro Edition, Second Edition

    Rahul Sharma, Beth Stearns Tony Ng J2EE Connector Architecture y Empresa Integracin de Aplicaciones

    Inderjeet Singh, Beth Stearns, Mark Johnson, Enterprise Equipo El diseo de aplicaciones empresariales con J2EE Plataforma, segunda edicin

    Inderjeet Singh, Sean Brydon, Greg Murray, Vijay Ramachandran, Thierry Violleau, Beth Stearns Diseo de Servicios Web con J2EE 1.4 Plataforma: JAX-RPC, SOAP y XML Tecnologas

    Kathy Walrath, Mary Campione, Alison Huml, Sharon Zakhour El Tutorial JFC Swing, Segunda edicin: Una gua para La construccin de interfaces grficas de usuario

    Steve Wilson, Jeff Kesselman Plataforma Java Rendimiento: Estrategias y Tcticas

    Sharon Zakhour, Scott Hommel, Jacob Royal, Isaac Rabinovitch, Tom Risser, Mark Hoeber El JavaTutorial, cuarta edicin: Un Curso Corto sobre los Fundamentos

    Kirk Chen, Li Gong Programacin Abierta Servicio Gateways con Java Embedded Server

    Zhiqun Chen Tecnologa Java Card para tarjetas inteligentes: Arquitectura y la Gua del Programador

    Maydene Fisher, Jon Ellis, Jonathan Bruce JDBC Tutorial API y Referencia, Tercera Edicin

    Eric Freeman, Susanne Hupfer, Ken Arnold JavaSpaces Principios , Patterns, and Practice

    Li Gong, Gary Ellison, Mary DAGEFRDE Dentro de Java 2 Platform Seguridad, segunda edicin: Arquitectura, Diseo API e implementacin

    James Gosling, Bill Joy, Guy Steele, Gilad Bracha El Java Language Specification, Tercera edicin

    Chet Haase, Romain individuo Clientes Filthy Rich: Desarrollo y animacin grfica Efectos para aplicaciones de escritorio Java

    Marcos Hapner, Rich Burridge, Rahul Sharma, Joseph Fialli, Kim Haase Java Message Service API Tutorial y Referencia: Mensajera para la plataforma J2EE

    www.it-ebooks.info

  • Effective Java

    Segunda edicin

    Joshua Bloch

    Upper Saddle River, Nueva Jersey Boston Indianapolis San Francisco Nueva York Toronto Montreal Londres Munich Pars Madrid Ciudad del Cabo Sydney Tokio Singapur Ciudad de Mxico

    www.it-ebooks.info

  • Muchas de las denominaciones utilizadas por los fabricantes y vendedores para distinguir sus productos se consideran marcas comerciales. Donde estas designaciones aparecen en este libro, y el editor fue consciente de una reclamacin de la marca, las designaciones han sido impreso con letra inicial mayscula o en todas las capitales. Sun Microsystems, Inc. tiene derechos de propiedad intelectual relacionados con las implementaciones de la tecnologa que se describen en este pub- cacin. En concreto, y sin limitacin alguna, estos derechos de propiedad intelectual pueden incluir una o ms patentes de Estados Unidos, por- Eign patentes o aplicaciones pendientes. Sun, Sun Microsystems, el logotipo de Sun, J2ME, J2EE, Java Card, y todas las marcas comerciales y logotipos basados en Sun y Java son el

    comercio- marcas comerciales o marcas comerciales registradas de Sun Microsystems, Inc., en los Estados Unidos y otros pases. UNIX es una marca registrada marca registrada en los Estados Unidos y otros pases, bajo licencia exclusiva de X / Open Company, Ltd. esta publicacin CIN SE PROPORCIONA "TAL CUAL" SIN GARANTA DE NINGN TIPO, YA SEA EXPRESA O IMPLCITA, INCLUYENDO ING, PERO NO LIMITADO A, LAS GARANTAS DE COMERCIALIZACIN, IDONEIDAD PARA UN PROPSITO PARTICULAR O NO INFRACCIN. ESTA PUBLICACIN CONTENGA TCNICA INEXACTITUDES O ERRORES TIPOGRFICOS. CAMBIOS PERIODICOS PARA LA INFORMA- CIN AQU; Estos cambios se incorporarn en nuevas ediciones de la publicacin. SOL MICROSYSTEMS, INC PUEDEN EFECTUAR MEJORAS Y / O CAMBIOS EN EL PRODUCTO (S) Y / O EL PROGRAMA (S) DESCRITO EN ESTA PUBLICACIN EN CUALQUIER MOMENTO. El autor y el editor han cuidado en la preparacin de este libro, pero hacer ninguna garanta expresa o implcita de ningn tipo y no asumimos ninguna responsabilidad por errores u omisiones. No se asume responsabilidad por daos incidentales o consecuentes en conexin con o que surjan de la utilizacin de la informacin o programas contenidos en el presente documento. El editor ofrece excelentes descuentos en este libro cuando se pide una cantidad para compras al por mayor o ventas especiales, que puede incluir las versiones electrnicas y / o cubiertas personalizadas y contenido concreto a su negocio, los objetivos de formacin, comercializacin enfocar, y los intereses de la marca. Para obtener ms informacin, pngase en contacto con: EE.UU. corporativos y gubernamentales de ventas (800) 382-3419 [email protected]

    Para las ventas fuera de los Estados Unidos, por favor pngase en

    contacto con: Ventas Internacionales [email protected]

    Vistenos en la Web: informit.com / aw Biblioteca del Congreso Nmero de control: 2008926278 Copyright 2008 Sun Microsystems, Inc. 4150 Red Circle, Santa Clara, California 95054 U.S.A Todos los derechos reservados. Impreso en los Estados Unidos de Amrica. Esta publicacin est protegida por derechos de autor, y permis- sin se debe obtener de la editorial antes de cualquier reproduccin prohibida, el almacenamiento en sistemas de recuperacin o trans- misin en cualquier forma o por cualquier medio, de fotocopia electrnico, mecnico, de grabacin, o as mismo. Para informacin con respecto a los permisos, escriba a: Pearson Education, Inc. Derechos y Contratos 501 Boylston Street, Suite 900 Boston, MA 02116 Fax: (617) 671-3447

    -13 ISBN: 978-0-321-35668-0 ISBN-10: los 0-321-35668-3 Texto impreso en los Estados Unidos en papel reciclado en Courier en Stoughton, Massachusetts. Primera edicin, mayo de 2008

    www.it-ebooks.info

  • A mi familia: Cindy, Tim, y Matt

    www.it-ebooks.info

  • Esta pgina ha sido dejada en blanco intencionalmente

    www.it-ebooks.info

  • Contenido

    Prlogo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii

    Prefacio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Xv

    Agradecimientos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix

    1 Introduccin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.1

    2 Creacin y destruccin de objetos. . . . . . . . . . . . . . . . . . 0.5

    Tema 1: Considere mtodos de generador estticos en lugar de constructores. . . 5

    Tema 2: Considere un constructor cuando se enfrentan a muchos constructor

    parmetros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    Tema 3: Hacer cumplir la propiedad singleton con un privado

    constructor o un tipo de enumeracin. . . . . . . . . . . . . . . . . . . . . . . 17

    Tema 4: Hacer cumplir noninstantiability con un constructor privado. . . . 19

    Tema 5: Evitar la creacin de objetos innecesarios. . . . . . . . . . . . . . . . . 20

    Tema 6: Eliminar las referencias a objetos en desuso. . . . . . . . . . . . . . . . . 24

    Tema 7: Evite los finalizadores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    3 mtodos comunes a todos los objetos. . . . . . . . . . . . . . . . . 0.33

    Tema 8: Respete el contrato general, cuando se reemplace es igual a . . . . .

    Tema 9: Siempre override hashCode cuando

    anular es igual a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Artculo 10: Siempre override toString . . . . . . . . . . . . . . . . . . . . . . . .

    Tema 11: Anulacin clon juiciosamente. . . . . . . . . . . . . . . . . . . . . . . .

    Tema 12: Considerar la implementacin de Comparable . . . . . . . . . . . . . . . .

    33

    45

    51

    54

    62

    ix

    www.it-ebooks.info

  • x CONTENIDOS

    4 clases e interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    Tema 13: Minimizar la accesibilidad de clases y miembros. . . . . . 67

    Artculo 14: En las clases pblicas, utilizar mtodos de acceso,

    campos no pblicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

    Tema 15: Minimizar mutabilidad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

    Artculo 16: Composicin de la Merced sobre la herencia. . . . . . . . . . . . . . . . . . 81

    Tema 17: Diseo y documentacin de la herencia o de lo prohban. . 87

    Artculo 18: Prefiero interfaces para las clases abstractas. . . . . . . . . . . . . . . . . . 93

    Tema 19: Use las interfaces slo para definir tipos. . . . . . . . . . . . . . . . . . . 98

    Artculo 20: Prefiero las jerarquas de clase para las clases marcadas. . . . . . . . . . . . . 100

    Tema 21: Utilizar la funcin de objetos para representar las estrategias. . . . . . . . . . . 103

    Artculo 22: Favorecer clases miembro estticas sobre no esttico. . . . . . . . . . . 106

    5 Los genricos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

    Artculo 23: No utilice tipos primas en el nuevo cdigo. . . . . . . . . . . . . . . . . . . 109

    Artculo 24: Eliminar las advertencias sin marcar. . . . . . . . . . . . . . . . . . . . . 116

    Artculo 25: Prefiero listas de matrices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

    Artculo 26: Favorecer tipos genricos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    Artculo 27: Favorecer mtodos genricos. . . . . . . . . . . . . . . . . . . . . . . . . . . 129

    Artculo 28: Uso limitado comodines para aumentar la flexibilidad de la API. . . . . 134

    Artculo 29: Considere typesafe contenedores heterogneos. . . . . . . . . . 142

    6 Las enumeraciones y anotaciones. . . . . . . . . . . . . . . . . . . . . . . . 147 Artculo 30: Use las enumeraciones en lugar de int constantes. . . . . . . . . . . . . . . . . 147

    Artculo 31: Utilice los campos de instancia en lugar de los ordinales. . . . . . . . . . . . . . .

    158

    Artculo 32: Uso EnumSet en lugar de campos de bits. . . . . . . . . . . . . . . . . . . 159

    Artculo 33: Uso EnumMap en lugar de indexacin ordinal. . . . . . . . . . . . . 161

    Artculo 34: Emular enumeraciones extensibles con interfaces. . . . . . . . . . . . 165

    Artculo 35: Prefiero anotaciones a modelos de nomenclatura. . . . . . . . . . . . . . . 169

    Artculo 36: utilizar siempre el Anular anotacin. . . . . . . . . . . . 176

    Artculo 37: Utilice las interfaces de marcador para definir tipos. . . . . . . . . . . . . . . 179

    7 Mtodos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

    Artculo 38: Compruebe los parmetros de validez. . . . . . . . . . . . . . . . . . . . . 181

    Artculo 39: Haga copias de defensa cuando sea necesario. . . . . . . . . . . . . . . . 184

    Artculo 40: firmas de los mtodos de diseo cuidado. . . . . . . . . . . . . . . . . 189

    Artculo 41: Uso sobrecarga juiciosamente. . . . . . . . . . . . . . . . . . . . . . . 191

    www.it-ebooks.info

  • CONTENIDOS xi

    Artculo 42: Uso varargs juiciosamente. . . . . . . . . . . . . . . . . . . . . . . . . . 197

    Artculo 43: Regreso arrays vacos o colecciones, no nulos. . . . . . . . . 201

    Artculo 44: Escribir comentarios de documentacin para todos los elementos de la API

    expuestas. . . . 203

    8 Programacin General. . . . . . . . . . . . . . . . . . . . . . . . 0.209

    Artculo 45: Reducir al mnimo el alcance de las variables locales. . . . . . . . . . . . . .

    .

    Artculo 46: Prefiero for-each bucles tradicionales para bucles. . . . . . . . .

    Artculo 47: Conocer y utilizar las bibliotecas. . . . . . . . . . . . . . . . . . . . . . .

    Artculo 48: Evitar flotador y doble si las respuestas exactas

    son obligatorios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Artculo 49: Prefiero tipos primitivos a los primitivos en caja. . . . . . . . . . .

    Artculo 50: Evite las cadenas donde otros tipos son ms apropiadas. .

    Artculo 51: Cuidado con el rendimiento de la concatenacin de cadenas. . . . . .

    Artculo 52: Consulte objetos por sus interfaces. . . . . . . . . . . . . . . . .

    Artculo 53: Prefiero interfaces para la reflexin. . . . . . . . . . . . . . . . . . . . .

    Artculo 54: Use mtodos nativos con criterio. . . . . . . . . . . . . . . . . . . .

    Artculo 55: Optimizar juiciosamente. . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Artculo 56: Se adhieren a los convenios de denominacin generalmente aceptada.

    . . . .

    209

    212

    215

    218

    221

    224

    227

    228

    230

    233

    234

    237

    9 Excepciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.241

    Artculo 57: Utilizar excepciones solo para condiciones excepcionales. . . . . . .

    Artculo 58: Uso comprueba excepciones para condiciones recuperables

    y las excepciones de tiempo de ejecucin de errores de programacin. . . . . . .

    Artculo 59: Evitar el uso innecesario de excepciones comprobadas. . . . . . . .

    Artculo 60: Favorecer el uso de las excepciones estndar. . . . . . . . . . . . . . . .

    Artculo 61: El tiro excepciones apropiadas a la abstraccin. . . . . . .

    Artculo 62: Documentar todas las excepciones producidas por cada mtodo. . . . . .

    Artculo 63: Incluir la informacin sobre fallos de captura en

    mensajes de detalle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

    Artculo 64: Luchar por la atomicidad fracaso. . . . . . . . . . . . . . . . . . . . . . .

    Artculo 65: No ignore excepciones. . . . . . . . . . . . . . . . . . . . . . . . .

    241

    244

    246

    248

    250

    252

    254

    256

    258

    10 Concurrencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.259

    Artculo 66: Sincronizar el acceso a los datos mutables compartidos. . . . . . . . . . .

    Artculo 67: Evitar la sincronizacin excesiva. . . . . . . . . . . . . . . . . .

    Artculo 68: Prefiero ejecutores y tareas a las roscas. . . . . . . . . . . . . . . .

    Artculo 69: Prefiero utilidades de concurrencia a esperar y notificar. . . . . . .

    259

    265

    271

    273

    www.it-ebooks.info

  • xii CONTENIDOS

    Artculo 70: Documento de seguridad de los subprocesos. . . . . . . . . . . . . . . . . . . . . . . . .

    . 278

    Artculo 71: Utilice la inicializacin perezosa juiciosamente. . . . . . . . . . . . . . . . . . 282

    Artculo 72: No depende del programador de subprocesos. . . . . . . . . . . . . . . 286

    Artculo 73: Evite los grupos de threads. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288

    11 serializacin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289

    Artculo 74: Implementar Serializable juiciosamente. . . . . . . . . . . . . . . 289

    Artculo 75: Considere el uso de un formulario serializado personalizado. . . . . . . . . . . . .

    295

    Artculo 76: Escribir readObject mtodos defensiva. . . . . . . . . . . . . 302

    Artculo 77: Para el control de ejemplo, prefieren tipos enum

    a readResolve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308

    Artculo 78: Considere proxies de serializacin en lugar de en serie

    instancias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312

    Apndice: artculos correspondientes a la Primera Edicin. . . . . . 317

    Referencias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321

    Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327

    www.it-ebooks.info

  • Prefacio

    YoF un colega fuera a decir a usted, "Esposa de m esta noche, hoy fabrica la comida inusual en una casa. ? Usted se unir a "tres cosas probablemente pasan por su mente: tercero, que haba sido invitado a la cena; segundo, que el Ingls no era su cola- la lengua materna de la liga; y en primer lugar, una buena dosis de perplejidad. Si usted ha estudiado alguna vez una segunda lengua a ti mismo y luego trat de usarlo fuera del aula, ya sabes que hay tres cosas que usted debe dominar: cmo el lenguaje se estructura (gramtica), cmo nombrar las cosas que quieres hablar (Vocabulario), y las formas habituales y eficaces de decir las cosas de todos los das (Uso). Con demasiada frecuencia, slo las dos primeras estn cubiertas en el aula, y te encuentras hablantes nativos constantemente suprimir su risa a medida que tratan de hacer usted mismo entendido. Es lo mismo con un lenguaje de programacin. Es necesario comprender la ncleo del lenguaje: es algortmica, funcional, orientado a objetos? Usted necesita saber el Vocabulario: qu estructuras de datos, operaciones y servicios son proporcionados por la bibliotecas estndar? Y tiene que estar familiarizado con el habitual y efectiva maneras de estructurar su cdigo. Libros sobre los lenguajes de programacin a menudo cubren slo los dos primeros, o discutir el uso de slo espordicamente. Tal vez es porque la primera dos son de alguna manera ms fcil de escribir. Gramtica y vocabulario son propias- lazos de la lengua solo, pero el uso es caracterstico de una comunidad que la utiliza. El lenguaje de programacin Java, por ejemplo, es orientado a objetos con un solo herencia y apoya una (declaracin orientada) estilo de programacin imperativa dentro cada mtodo. Las bibliotecas de abordar el apoyo grfico de visualizacin, creacin de redes, distri- computing buido, y la seguridad. Pero, cmo es el lenguaje mejor puesto en uso en la prctica? Hay otro punto. Programas, a diferencia de frases habladas ya diferencia de la mayora libros y revistas, son susceptibles de ser cambiado con el tiempo. Por lo general no es suficiente para producir cdigo que funcione de manera eficaz y sean fcilmente comprensibles por otra per- hijos; tambin hay que organizar el cdigo para que sea fcil de modificar. Puede haber diez maneras de escribir cdigo para una tarea T. De esos diez maneras, siete ser torpe, ineficiente o desconcertante. De los otros tres, lo que es ms probable que sea similar a la cdigo necesario para la tarea T ' en la versin de software del ao que viene?

    xiii

    www.it-ebooks.info

  • xiv PRLOGO

    Existen numerosos libros de los cuales se puede aprender la gramtica de la Java Lenguaje de programacin, incluyendo El lenguaje de programacin Java por Arnold, Gosling, y Holmes [Arnold05] o La especificacin del lenguaje Java por Gos- ling, Alegra, su servidor, y Bracha [JLS]. Del mismo modo, hay docenas de libros sobre las bibliotecas y las API asociadas con el lenguaje de programacin Java. Este libro aborda su tercera necesidad: el uso consuetudinario y eficaz. Joshua Bloch ha pasado aos que se extiende, la implementacin y el uso de la programacin Java lenguaje de Sun Microsystems; l tambin ha ledo un montn de cdigo de otras personas, incluyendo la ma. Aqu se ofrece un buen consejo, organizada sistemticamente, sobre la forma de estructurar su cdigo para que funcione bien, para que otras personas puedan entenderlo, por lo que las modificaciones y mejoras en el futuro son menos propensos a causar dolores de cabeza- tal vez, incluso, para que sus programas sern agradables, elegante y graciosa.

    De Guy L. Steele Jr. Burlington, Massachusetts 04 2001

    www.it-ebooks.info

  • Prefacio

    Prefacio a la Segunda Edicin

    LaMuchas cosas han pasado a la plataforma Java desde que escrib la primera edicin de este libro en 2001, y ya es hora para una segunda edicin. El conjunto ms significativo de los cambios fue la incorporacin de los genricos, tipos de enumeracin, anotaciones, autoboxing, y la for-each bucle en Java 5. Un primer segundo fue la adicin de la nueva biblioteca de concurrencia, java.util.concurrent, Tambin lanzado en Java 5. Con Gilad Bracha, tuve la buena fortuna de dirigir a los equipos que disearon las nuevas caractersticas del lenguaje. Tambin tuve la buena fortuna de formar parte del equipo que dise y desarroll la concurrencia biblioteca, que fue dirigido por Doug Lea. El otro gran cambio en la plataforma es la adopcin generalizada de la moderna Entornos de desarrollo integrado (IDE), como Eclipse, IntelliJ IDEA, y NetBeans, y de herramientas de anlisis esttico, como FindBugs. Aunque no he sido involucrado en estos esfuerzos, me he beneficiado de ellos inmensamente y aprend que afectan a la experiencia de desarrollo de Java. En 2004, me mud de Sun a Google, pero he seguido mi participacin en el desarrollo de la plataforma Java en los ltimos cuatro aos, contribuyendo a la APIs de concurrencia y colecciones a travs de los buenos oficios de Google y Java Proceso de Comunidad. Tambin he tenido el placer de utilizar la plataforma Java para desarrollar bibliotecas para su uso dentro de Google. Ahora s lo que se siente al ser un usuario. Como fue el caso en 2001 cuando escrib la primera edicin, mi objetivo principal es compartir mi experiencia con ustedes para que pueda imitar mis xitos y evitar mis fracasos. El nuevo material sigue haciendo un uso liberal de real examen- pios de las bibliotecas de la plataforma Java. La primera edicin tuvo xito ms all de mis expectativas ms optimistas, y yo he hecho mi la mejor manera de permanecer fiel a su espritu, mientras cubra todo el nuevo material que fue solicitrsele que lleve el libro hasta la fecha. Era inevitable que el libro iba a crecer, y crecer lo hizo, cincuenta hasta siete elementos a setenta y ocho. No slo tena que aadir veintitrs artculos, pero revis a fondo todo el material original y me retir un

    xv

    www.it-ebooks.info

  • xvi PRLOGO

    algunos artculos cuyos mejores das haban pasado. En el apndice, se puede ver cmo el En este libro se refiere al material en la primera edicin. En el prefacio a la primera edicin, escrib que el lenguaje de programacin Java y sus bibliotecas eran inmensamente favorable a la calidad y la productividad, y una alegra para trabajar con. Los cambios en las emisiones 5 y 6 han tomado una buena cosa y lo hizo mejor. La plataforma es mucho ms grande de lo que era en 2001 y ms complejo, pero una vez que aprenda los patrones y frases hechas para el uso de las nuevas caractersticas, que

    hacen sus programas mejor y su vida ms fcil. Espero que esta edicin capta mi conti- UED entusiasmo por la plataforma y ayuda a que su uso de la plataforma y su nuevas caractersticas ms eficaz y agradable.

    San Jose, California 04 2008

    Prefacio a la primera edicin

    En 1996 me detuve en juego y se dirigi al oeste para trabajar para JavaSoft, como lo era entonces conocido, porque estaba claro que all era donde estaba la accin. En el intervalo de cinco aos que he servido como bibliotecas de la plataforma Java arquitecto. He diseado, imple- mentado, y mantiene muchas de las bibliotecas y se desempe como consultor para muchos otros. Presidiendo estas bibliotecas como la plataforma Java madurado era una vez que-en un- oportunidad de su vida. No es ninguna exageracin decir que tuve el privilegio de trabajar con algunos de los grandes ingenieros de software de nuestra generacin. En el proceso, he aprendido

    mucho sobre el lenguaje de programacin Java, lo que funciona, lo que no, y cmo usarlo el lenguaje y sus bibliotecas de la mejor manera. Este libro es mi intento de compartir mi experiencia con ustedes para que pueda mimetizar litar mis xitos, evitando mis fracasos. Tom prestado el formato de Scott De Meyers A partir del C + + [Meyers98], que consta de cincuenta artculos, cada transmitir- ing una regla especfica para mejorar sus programas y diseos. Encontr el formato ser singularmente eficaz, y espero que t tambin. En muchos casos, me tom la libertad de ilustrar los artculos con el mundo real ejemplos de las bibliotecas de la plataforma Java. Cuando se describe algo que podra haber hecho mejor, trat de recoger el cdigo que escrib yo mismo, pero de vez en cuando Recojo en algo escrito por un colega. Me disculpo sinceramente si, a pesar de mi mejores esfuerzos, he ofendido a nadie. Ejemplos negativos se citan para no echar la culpa

    www.it-ebooks.info

  • PRLOGO xvii

    pero en el espritu de cooperacin, a fin de que todos podamos aprovechar la experiencia de aquellos que han ido antes. Aunque este libro no est dirigido nicamente a los desarrolladores de componentes reutilizables,

    que se colorea inevitablemente por mi experiencia escribiendo tales componentes en los ltimos dos dcadas. Creo que de forma natural en trminos de las API exportadas (Application Programming Interfaces), y os animo a hacer lo mismo. Incluso si usted no est desarrollando componentes reutilizables, pensando en estos trminos tiende a mejorar la calidad de la software que escriba. Adems, no es raro escribir una reutilizable compo- nente sin saberlo: Escribes algo til, compartirlo con su amigo otro lado del pasillo, y en poco tiempo usted tiene media docena de usuarios. En este punto, usted no ya tener la flexibilidad de cambiar el API en la voluntad y son agradecidos por todo el esfuerzo que usted pone en el diseo de la API de la primera vez que escribi el software. Mi enfoque en el diseo de la API puede parecer un poco antinatural para los devotos de la nueva metodologas de desarrollo de software ligero, como Extreme Programming [Beck99]. Estas metodologas enfatizan escribir el programa ms simple que posiblemente podra trabajar. Si est utilizando uno de estos mtodos, usted encontrar que un enfoque en el diseo de la API que sirve bien en la refactorizacin proceso. La fundamental objetivos de refactorizacin son la mejora de la estructura del sistema y la evitacin de la duplicacin de cdigo. Estas metas son imposibles de alcanzar en ausencia de bien- APIs diseadas para los componentes del sistema. Ninguna lengua es perfecto, pero algunos son excelentes. He encontrado el Java lenguaje de programacin y sus bibliotecas a ser inmensamente favorable a la calidad y productividad, y un placer trabajar con ella. Espero que este libro capta mi entusiasmo y ayuda a que su uso del lenguaje ms eficaz y agradable.

    Cupertino, California 04 2001

    www.it-ebooks.info

  • Esta pgina ha sido dejada en blanco intencionalmente

    www.it-ebooks.info

  • Agradecimientos

    Agradecimientos para la Segunda Edicin

    Yoagradecer a los lectores de la primera edicin de este libro para darle tal naturaleza y entusiasta recepcin, para la toma de sus ideas para el corazn, y por dejarme saber lo que es un influencia positiva que tuvo en ellos y su trabajo. Doy las gracias a los muchos profesores que utilizado el libro en sus cursos, y los muchos equipos de ingenieros que lo adoptaron. Doy las gracias a todo el equipo de Addison-Wesley para su amabilidad, profesin- lismo, la paciencia, y la gracia bajo presin. A pesar de todo, mi editor Greg Doench permanecido imperturbable: una multa editor y un perfecto caballero. Mi produccin de man- ager, Julie Nahil, era todo lo que un gerente de produccin debe ser: diligente, rpida, organizada y amigable. Mi editor, Barbara Wood, era meticuloso y de buen gusto. He estado una vez ms bendecido con el mejor equipo de revisores imaginables, y le doy mi ms sincero agradecimiento a cada uno de ellos. El equipo central, que revis cada captulo, consisti en Lexi Baugher, Cindy Bloch, Beth Bottos, Joe Bowbeer, Brian Goetz, Tim Halloran, Brian Kernighan, Rob Konigsberg, Tim Peierls, Bill Pugh, Yoshiki Shibata, Peter Stout, Peter Weinberger, y Frank Yellin. Otro revisores incluyeron Pablo Bellver, Dan Bloch, Dan Bornstein, Kevin Bourrillion, Martin Buchholz, Joe Darcy, Neal Gafter, Laurence Gonsalves, Aaron Green- casa, Barry Hayes, Peter Jones, Angelika Langer, Doug Lea, Bob Lee, Jeremy Manson, Tom May, Mike McCloskey, Andriy Tereshchenko, y Paul Tyma. Una vez ms, estos revisores hicieron numerosas sugerencias que dieron lugar a una gran mejora mentos en este libro y me salv de muchas situaciones embarazosas. Y de nuevo, cualquier restantes vergenzas son mi responsabilidad. Doy gracias especiales a Doug Lea y Tim Peierls, quien se desempe como sonando tablas para muchas de las ideas de este libro. Doug y Tim era infaliblemente ge- unidades organizativas con su tiempo y conocimientos. Doy gracias a mi gerente de Google, Prabha Krishna, por su continuo apoyo y estmulo.

    xix

    www.it-ebooks.info

  • xx AGRADECIMIENTOS

    Finalmente, agradezco a mi esposa, Cindy Bloch, por animarme a escribir, para leer- cin cada elemento en forma cruda, por ayudarme con Framemaker, para escribir el ndice, y por aguantarme a m mientras escriba.

    Agradecimientos por la Primera Edicin

    Doy las gracias a Patrick Chan por sugerir que escribo este libro y por lanzar la idea de Lisa es amable, el jefe de redaccin series; Tim Lindholm, el editor tcnico series; y Mike Hendrickson, editor ejecutivo de Addison-Wesley. Doy las gracias a Lisa, Tim, y Mike por animarme a continuar con el proyecto y por su paciencia sobrehumana y la fe inquebrantable que algn da escribir este libro. Doy las gracias a James Gosling y su equipo original para darme algo grande Escribo sobre, y agradezco a los muchos ingenieros de la plataforma Java que siguieron Los pasos de James. En particular, agradezco a mis colegas de Sun Java Platform Herramientas y Bibliotecas Grupo por sus ideas, su aliento y su apoyo- puerto. El equipo est formado por Andrew Bennett, Joe Darcy, Neal Gafter, Iris Garca, Konstantin Kladko, Ian Little, Mike McCloskey, y Mark Reinhold. Ex miembros incluyen Zhenghua Li, Bill Maddox, y Naveen Sanjeeva. Doy gracias a mi manager, Andrew Bennett, y mi director, Larry Abrahams, para prestar su apoyo pleno y entusiasta a este proyecto. Doy las gracias a Rich Green, el VP de Ingeniera de software de Java, para proporcionar un entorno en el inge- ros son libres de pensar de forma creativa y para publicar su trabajo. He sido bendecido con el mejor equipo de revisores imaginables, y doy mi ms sincero agradecimiento a cada uno de ellos: Andrew Bennett, Cindy Bloch, Dan Bloch, Beth Bottos, Joe Bowbeer, Gilad Bracha, Mary Campione, Joe Darcy, David Eckhardt, Joe Fialli, Lisa friendly, James Gosling, Peter Haggar, David Holmes, Brian Kernighan, Konstantin Kladko, Doug Lea, Zhenghua Li, Tim Lindholm, Mike McCloskey, Tim Peierls, Mark Reinhold, Ken Russell, Bill Shannon, Peter Stout, Phil Wadler, y dos revisores annimos. Ellos hicieron numerosas sugerencias que dio lugar a grandes mejoras en este libro y me salv de muchos vergenzas. Cualquier vergenzas restantes son mi responsabilidad. Numerosos colegas, dentro y fuera de Sun, participaron en tcnica discusiones que mejoraron la calidad de este libro. Entre otros, Ben Gomes, Steffen Grarup, Peter Kessler, Richard Roda, John Rose, y David Stoutamire

    www.it-ebooks.info

  • AGRADECIMIENTOS xxi

    contribuido ideas tiles. Un agradecimiento especial se debe Doug Lea, quien se desempe como caja de resonancia de muchas de las ideas de este libro. Doug ha sido indefectiblemente generoso con su tiempo y sus conocimientos. Doy las gracias a Julie Dinicola, Jacqui Doucette, Mike Hendrickson, Heather Olszyk, Tracy Russ, y todo el equipo de Addison-Wesley por su apoyo y profe- lismo. Incluso bajo un calendario increblemente apretado, siempre fueron muy amables y servicial. Doy las gracias de Guy Steele para escribir el prlogo. Me siento honrado de que l eligi participar en este proyecto. Finalmente, agradezco a mi esposa, Cindy Bloch, para fomentar y ocasionalmente amenazndome a escribir este libro, para la lectura de cada elemento en su forma cruda, en busca de

    ayuda- me ing con Framemaker, para escribir el ndice, y por aguantarme a m mientras yo escribi.

    www.it-ebooks.info

  • Esta pgina ha sido dejada en blanco intencionalmente

    www.it-ebooks.info

  • C A P T U L 1

    Introduccin

    TSu libro est diseado para ayudarle a hacer el uso ms eficaz de la Java lenguaje de programacin y sus bibliotecas fundamentales, java.lang,java.util, y, en menor medida, java.util.concurrent y java.io. El libro discute otras bibliotecas de vez en cuando, pero no cubre la interfaz grfica de usuario programacin, APIs empresariales, o los dispositivos mviles. Este libro consta de setenta y ocho artculos, cada uno de los cuales transmite una regla. Las prcticas de las normas de captura generalmente celebradas a ser beneficioso por la mejor y ms programadores experimentados. Los elementos se agrupan libremente en diez captulos, cada uno relativa a un aspecto amplio de diseo de software. El libro no se pretende que sea leer de principio a fin: cada elemento se sostiene por s, ms o menos. Los artculos son fuertemente con referencias cruzadas para que pueda trazar fcilmente su propio curso a travs del

    libro. Muchas nuevas caractersticas se han aadido a la plataforma en Java 5 (versin 1.5). La mayor

    parte de los elementos de este manual utilizan estas caractersticas de alguna manera. La siguiente tabla

    muestra a dnde ir para la cobertura primaria de estas caractersticas:

    Caracterstica

    Genricos

    Las

    enumeraciones Anotaciones

    Con fines de cada bucle

    Autoboxing

    Varargs

    Importacin esttica

    java.util.concurrent

    Captulo o artculo

    Captulo 5

    Artculos 30 a 34

    Artculos 35 a 37

    Artculo 46

    Los artculos 40, 49

    Artculo 42

    Artculo 19

    Los artculos 68, 69

    1

    www.it-ebooks.info

  • 2 CAPTULO 1 INTRODUCCIN

    La mayora de los artculos se ilustran con ejemplos de programas. Una caracterstica clave de este

    libro es que contiene ejemplos de cdigo que ilustran muchos patrones de diseo y modismos. En su caso, se les referencias cruzadas a la obra de referencia en este mbito [Gamma95]. Muchos artculos contienen uno o ms ejemplos de programas que ilustran un poco de prctica que debe evitarse. Tales ejemplos, a veces conocido como antipatrones, son claramente marcado con un comentario como "/ / Nunca hagas esto!"En cada caso, el elemento explica por qu el ejemplo es malo, y sugiere un enfoque alternativo. Este libro no es para principiantes: se supone que ya se siente cmodo con el lenguaje de programacin Java. Si no es as, considere uno de los muchos bien textos introductorios [Arnold05, Sestoft05]. Mientras que el libro est diseado para ser acce- sible a cualquier persona con un conocimiento prctico de la lengua, se debe proporcionar alimentos para el pensamiento, incluso para programadores avanzados. La mayor parte de las reglas de este libro se derivan de una serie de principios fundamentales. Clar- dad y la sencillez son de suma importancia. El usuario de un mdulo debe nunca ser sorprendido por su comportamiento. Los mdulos deben ser lo ms pequeo posible, pero

    no ms pequeo. (Tal como se utiliza en este libro, el trmino mdulo se refiere a cualquier software reutilizable componente, a partir de un mtodo individual a un sistema complejo que consta de mltiples los paquetes.) Cdigo debera ser reutiliza en lugar de copiar. Las dependencias entre mdulos deben mantenerse al mnimo. Los errores deben ser detectados tan pronto como sea posi- ble despus de que se hacen, a ser posible en tiempo de compilacin. Si bien las reglas de este libro no se aplican al 100 por ciento de las veces, lo hacen caracterizar las mejores prcticas de programacin en la gran mayora de los casos. Usted no debe seguir ciegamente estas reglas, pero violarlos slo ocasionalmente y con buena razn. Aprender el arte de la programacin, como la mayora de otras disciplinas, consiste primero aprender las reglas y luego aprender cuando romperlas. En su mayor parte, este libro no es sobre el rendimiento. Se acerca escribiendo pro- gramos que son clara, correcta, til, robusta, flexible y fcil de mantener. Si puede hacer eso, por lo general es una cuestin relativamente sencilla para obtener el rendimiento que

    necesita (Artculo 55). Algunos elementos hacen discutir los problemas de rendimiento, y algunos de estos

    artculos proporcionar los nmeros de rendimiento. Estos nmeros, que se introducen con la frase "En mi mquina," debe considerarse como aproximadas en el mejor. Por si sirve de algo, mi mquina es una construccin casera de envejecimiento 2,2 GHz dual-core AMD Opteron 170 con 2 gigabytes de RAM, corriendo de Sun 1.6_05 liberacin de el Java SE Development Kit (JDK) encima de Microsoft Windows XP Professional SP2. Este JDK tiene dos mquinas virtuales, el cliente de Java HotSpot y el servidor VMs. Las cifras de rendimiento se midieron en la VM Server.

    www.it-ebooks.info

  • CAPTULO 1 INTRODUCCIN 3

    Cuando se habla de las caractersticas del lenguaje de programacin Java y sus bibliotecas, a veces es necesario hacer referencia a versiones especficas. Por razones de brevedad, este libro

    utiliza "los nmeros de versin de ingeniera" en preferencia a los nombres de lanzamiento oficial. Esta tabla muestra la asignacin entre los nombres de la versin y los nmeros de versin de la ingeniera.

    Oficial Nombre de la liberacin

    JDK 1.1.x / JRE 1.1.x

    Java 2 Platform, Standard Edition, v 1.2

    Java 2 Platform, Standard Edition, v 1.3

    Java 2 Platform, Standard Edition, v 1.4

    Java 2 Platform, Standard Edition, v 5.0

    Java Platform, Standard Edition 6

    Ingeniera Nmero de versin

    1.1

    1.2

    1.3

    1.4

    1.5

    1.6

    Los ejemplos estn razonablemente completa, pero desean que se convoque la legibilidad sobre

    com- completitud. Ellos utilizan libremente las clases de los paquetes java.util y java.io. En Para compilar los ejemplos, es posible que tenga que aadir una o ms de estas importaciones declaraciones:

    java.util import *.; java.util.concurrent import *.; import java.io. *;

    Otros repetitivo se omite de manera similar. El sitio web del libro, http:// java.sun.com / docs / books / efectiva, Contiene una versin ampliada de cada ejemplo, que se puede compilar y ejecutar. En su mayor parte, este libro utiliza trminos tcnicos tal como se definen en La Java Language Specification, Tercera edicin [JLS]. Unos trminos merecen especial mencionar. El lenguaje soporta cuatro tipos de tipos: interfaces de (Incluyendo annota- ciones), clases de (Incluyendo enumeraciones), arrays, y primitivas. Los tres primeros son conocidos como los tipos de referencia. Instancias de clase y las matrices son objetos; valores primitivos no lo son. De una clase miembros consistir en su campos, mtodos, clases de miembros, y miembro interfaces. De un mtodo firma consiste en su nombre y el tipo de sus obligaciones formales parmetros; la firma hace no incluir el tipo de devolucin del mtodo. Este libro utiliza algunos trminos de manera diferente de la El lenguaje Java Specification cin. Desemejante La especificacin del lenguaje Java, Este libro utiliza herencia como syn- onym para subclases. En lugar de utilizar el trmino herencia para las interfaces, este

    www.it-ebooks.info

  • 4 CAPTULO 1 INTRODUCCIN

    libro se limita a establecer que una clase implementos una interfaz o que una interfaz se extiende otra. Describir el nivel de acceso que se aplica cuando no se especifica ninguno, Este libro utiliza el trmino descriptivo paquete-privada en lugar de la tcnica cor- plazo rect acceso predeterminado [JLS, 6.6.1]. Este libro utiliza algunos trminos tcnicos que no estn definidos en El Java Lan- guaje Specification. El trmino API exportada, o simplemente API, se refiere a las clases, interfaces, constructores, miembros y formularios serializados por el cual un programador accede a una clase, interfaz o paquete. (El trmino API, que es la abreviatura de aplicacin interfaz de programacin cin, se utiliza con preferencia al trmino de otra manera preferible interfaz para evitar la confusin con la construccin del lenguaje de ese nombre.) Un pro- Grammer que escribe un programa que utiliza una API se refiere como un usuario de la API. Una clase cuya aplicacin utiliza una API es un cliente de la API. Las clases, interfaces, constructores, miembros y formularios serializados son colec- mente conocido como Elementos de la API. Una API exportada se compone de los elementos de la API que son accesibles exterior del paquete que define la API. Estos son los ele-API mentos que cualquier cliente puede utilizar y el autor de la API se compromete a apoyar. No coincidentemente, tambin son los elementos para los que la utilidad Javadoc genera documentacin en su modo de funcionamiento por defecto. Libremente hablando, el exportado API de un paquete se compone de los miembros pblicos y protegidos y constructores de cada clase o interfaz pblica en el paquete.

    www.it-ebooks.info

  • C A P T U L 2 Creacin y destruccin de objetos

    TSu captulo preocupaciones Creacin y destruccin de objetos: cundo y cmo crear ellos, cundo y cmo evitar la creacin de ellos, la forma de garantizar que sean destruidos en un tiempo y forma, y la forma de gestionar las acciones de limpieza que deben preceder su destruccin.

    Tema 1: Considere mtodos de generador estticos en lugar de constructores La forma normal de una clase para permitir a un cliente para obtener una instancia de s mismo es pro- cionar un constructor pblico. Existe otra tcnica que debe ser una parte de todos los kit de herramientas del programador. Una clase puede ofrecer a un pblico mtodo de fbrica esttica, que es simplemente un mtodo esttico que devuelve una instancia de la clase. Aqu est un examen simple plo de Boolean (La clase primitiva caja para el tipo primitivo boolean). Este mtodo traduce un boolean valor simple en un Boolean referencia de objeto:

    static Boolean valueOf (boolean b) { volver b? Boolean.TRUE: Boolean.FALSE; }

    Tenga en cuenta que un mtodo de fbrica esttica no es el mismo que el Factory Method patrn desde Patrones de Diseo [Gamma95, p. 107]. El mtodo de fbrica esttica se describe en Este artculo no tiene equivalente directo en Patrones de diseo. Una clase puede ofrecer a sus clientes los mtodos estticos de la fbrica en lugar de, o en Adems, los constructores. Proporcionar un mtodo de fbrica esttica en lugar de un pblico constructor tiene tanto ventajas como desventajas. Una de las ventajas de los mtodos de fbrica estticos es que, a diferencia de los constructores, se tienen nombres. Si los parmetros de un constructor no lo hacen, en s mismas, describir el objeto que se devuelve, una fbrica esttica con un nombre bien elegido es fcil- ier de usar y el cdigo de cliente que resulta ms fcil de leer. Por ejemplo, el constructor

    5

    www.it-ebooks.info

  • 6 CAPTULO 2 Crear y destruir objetos

    que devuelve una BigInteger que es probablemente prime, se habra expresado mejor como un mtodo de fbrica esttico denominado Bigin- teger.probablePrime. (Este mtodo fue finalmente aadi en el comunicado de 1.4.) Una clase slo puede tener un nico constructor con una firma determinada. Programa- dores se han sabido para evitar esta restriccin, proporcionando dos constructores cuyo parmetro listas slo difieren en el orden de sus tipos de parmetros. Este es un muy mala idea. El usuario de una API como nunca ser capaz de recordar lo que constructor es cul y acabar llamando a la persona equivocada por error. Personas lectura de cdigos que utiliza estos constructores no sabr lo que hace el cdigo con- a cabo en referencia a la documentacin de la clase. Debido a que tienen nombres, mtodos de generador estticos no compartir la restriccin discutido en el prrafo anterior. En los casos en que una clase parece requerir mltiples constructores ple con la misma firma, sustituyen a los constructores con esttica fac- mtodos de historia y cuidadosamente elegidos nombres para resaltar sus diferencias. Una segunda ventaja de los mtodos de fbrica estticos es que, a diferencia de los constructores, no son necesarios para crear un nuevo objeto cada vez que estn invocados. Este permite que las clases inmutables (artculo 15) para utilizar instancias preconstruidos, o cach casos a medida que se construyeron, y prescinden de ellos varias veces para evitar la creacin de objetos duplicados innecesarios. La Boolean.valueOf (boolean) mtodo ilus- trados esta tcnica: nunca crea un objeto. Esta tcnica es similar a la Peso mosca patrn [Gamma95, p. 195]. Se puede mejorar el rendimiento si Se ruega a los objetos equivalentes a menudo, especialmente si son caros de crear. La capacidad de los mtodos de fbrica estticos para devolver el mismo objeto desde repetida invocaciones permite a clases para mantener un estricto control sobre lo que existen casos en cualquier momento. Las clases que hacen esto se dice que son instancia controlada. Hay varios razones para escribir clases de instancia controlada. Control Instancia permite a una clase garantiza que sea un producto nico (artculo 3) o no instanciable (punto 4). Adems, permite una clase inmutable (artculo 15) para que la garanta de que no hay dos casos iguales existir: a.equals (b) si y slo si a == b. Si una clase tiene esta garanta, entonces su cli- los padres pueden utilizar el == operador en lugar de la equals (Object) mtodo, que puede como resultado un mejor rendimiento. Tipos Enum (artculo 30) ofrecen esta garanta. Una tercera ventaja de los mtodos de fbrica estticos es que, a diferencia de los constructores, pueden devolver un objeto de cualquier subtipo de su tipo de retorno. Esto le da una gran flexibilidad en la eleccin de la clase del objeto devuelto. Una aplicacin de esta flexibilidad es que una API puede devolver objetos sin haciendo sus clases pblicas. Ocultacin de clases de implementacin de esta manera conduce a una API muy compacto. Esta tcnica se presta a marcos basadas en la interfaz (Artculo 18), donde las interfaces proporcionan tipos de retorno naturales de mtodos de fbrica

    estticas.

    www.it-ebooks.info

    BigInteger (int, int, Random),

  • TEMA 1: CONSIDERAR LA ESTTICA MTODOS DE FBRICA EN VEZ DE CONSTRUCTORES 7

    Las interfaces no pueden tener mtodos estticos, por lo que, por convencin, mtodos de generador

    estticos para una interfaz llamada Tipo se ponen en una clase no instanciable (punto 4) llamado Tipos. Por ejemplo, el marco de las colecciones de Java tiene treinta y dos de conveniencia implementaciones de las interfaces de coleccin, proporcionando colecciones inmodificables, colecciones sincronizado, y similares. Casi todas estas implementaciones son exportados a travs de mtodos de fbrica estticos en una clase no instanciable (java.util.Col- colecciones). Las clases de los objetos devueltos son todos no pblica. El API Collections Framework es mucho menor de lo que hubiera sido si export treinta y dos clases pblicas separadas, una para cada uno de conveniencia imple- mentacin. No es slo la mayor parte de la API que se reduce, pero el conceptual peso. El usuario sabe que el objeto devuelto tiene precisamente la API especificado por su interfaz, lo que no hay necesidad de leer documentacin de la clase adicional para el clases de implementacin. Adems, utilizando un mtodo de fbrica tales esttica requiere el cliente para hacer referencia al objeto devuelto por su interfaz en lugar de su implementacin cin de clase, que es generalmente una buena prctica (artculo 52). No slo la clase de un objeto devuelto por un mtodo de fbrica static sea pblica, pero la clase puede variar de invocacin a la invocacin dependiendo los valores de los parmetros a la fbrica esttica. Cualquier clase que es un subtipo de la tipo de retorno declarado es permisible. La clase del objeto devuelto tambin puede variar de versin a versin para una mayor facilidad de mantenimiento y rendimiento del software. La clase java.util.EnumSet (Artculo 32), introducido en la versin 1.5, no tiene constructores pblicos, slo las fbricas estticas. Vuelven uno de dos implementaciones, dependiendo del tamao del tipo de enumeracin subyacente: si tiene sesenta y cuatro o menos elementos, como la mayora de los tipos de enumeracin hacen, las fbricas estticas devuelven un RegularEnumSet ejemplo, que est respaldado por un solo largo; si el tipo de enumeracin tiene sesenta y cinco aos o

    ms elementos, las fbricas devuelven un JumboEnumSet ejemplo, respaldado por una largo array. La existencia de estas dos clases de implementacin es invisible a los clientes. Si RegularEnumSet dej de ofrecer ventajas de rendimiento para los pequeos tipos de enumeracin, se podra ser eliminada de una versin futura sin efectos nocivos. Del mismo modo, un futuro liberacin podra aadir una tercera o cuarta aplicacin de la EnumSet si resultaba benefi- CIAL para el rendimiento. Los clientes no saben ni les importa la clase del objeto que regresen de la fbrica; que les importa slo que es un poco de la subclase de EnumSet. La clase de objeto devuelto por un mtodo de fbrica esttica ni siquiera tiene por qu existir en el momento de escribir la clase que contiene el mtodo. Dicha fbrica esttica flexibles mtodos forman la base de marcos de proveedores de servicios, tales como la Base de Datos de Java API Connectivity (JDBC). Un marco de proveedor de servicio es un sistema en el cual mltiples proveedores de servicios implementar un servicio, y el sistema hace que la imple- mentaciones a disposicin de sus clientes, que evitan que aqullas de las implementaciones.

    www.it-ebooks.info

  • 8 CAPTULO 2 Crear y destruir objetos

    Hay tres componentes esenciales de un marco de servicios: una ser- interfaz de vicio, que los proveedores implementen; un API de registro de proveedores, que el sistema utiliza para registrar las implementaciones, dando a los clientes acceso a las mismas; y un ser- Acceso vicio API, que los clientes utilizan para obtener una instancia del servicio. El servicio acceso a la API normalmente permite, pero no requiere que el cliente especifique algunos criterios para la eleccin de un proveedor. En la ausencia de tal especificacin, la API devuelve un instancia de una implementacin por defecto. La API de acceso al servicio es la "esttica flexibles de fbrica "que forma la base del marco de proveedor de servicios. Un cuarto componente opcional de un marco de servicios es un servicio interfaz de proveedor, que los proveedores implementen para crear instancias de su servicio aplicacin. En ausencia de un proveedor de servicios de interfaz, las implementaciones estn registrados por nombre de clase y una instancia reflexiva (artculo 53). En el caso de los JDBC, Conexin juega la parte de la interfaz de servicio, DriverManager.reg- isterDriver es la API de registro de proveedor, DriverManager.getConnection es la API de acceso a los servicios, y Conductor es la interfaz de proveedor de servicios. Existen numerosas variantes del patrn de marco proveedor de servicios. Para ejemplo, la API de acceso al servicio puede devolver una interfaz de servicio ms rica que la requerida del proveedor, utilizando el patrn de adaptador [Gamma95, p. 139]. Aqu hay una aplicacin sencilla con una interfaz de proveedor de servicios y un proveedor por defecto:

    / Servicio boceto / marco proveedor

    / / Interfaz de servicio Interfaz de servicio pblico { Mtodos ... / / especfica de servicio, entra aqu }

    / / Servicio de interfaz del proveedor Proveedor de interfaz pblica { NewService Servicio (); }

    / / Clase no instanciable para el registro del servicio y el acceso Servicios public class { Servicios privados () {} / / Evita la creacin de instancias (artculo 4)

    / / nombres de servicio con los servicios privados de los proveedores finales estticos Mapa = nueva ConcurrentHashMap (); public static final String DEFAULT_PROVIDER_NAME = "";

    www.it-ebooks.info

  • TEMA 1: CONSIDERAR LA ESTTICA MTODOS DE FBRICA EN VEZ DE CONSTRUCTORES 9

    / / Proveedor de API de registro public static void registerDefaultProvider (Proveedor p) { registerProvider (DEFAULT_PROVIDER_NAME, p); } public static void registerProvider (String nombre, Proveedor p) { providers.put (nombre, p); }

    / / Servicio de acceso a la API public static Servicio newInstance () { volver newInstance (DEFAULT_PROVIDER_NAME); } static Servicio newInstance (String nombre) { Proveedor p = providers.get (nombre); if (p == null) throw new IllegalArgumentException ( "Ningn proveedor registrado con el nombre:" + nombre); p.newService regresar (); }

    }

    Una cuarta ventaja de los mtodos de fbrica estticos es que reducen la VER- bosity de crear instancias de tipo con parmetros. Por desgracia, debe espe- cificar los parmetros de tipo al invocar el constructor de una clase parametrizada incluso si son evidentes por el contexto. Esto normalmente requiere que usted provea la parmetros de tipo dos veces en rpida sucesin:

    Map m = new HashMap ();

    Esta especificacin redundante deja rpidamente doloroso como la longitud y la complejidad dad del incremento parmetros de tipo. Con fbricas estticas, sin embargo, el compilador puede averiguar los parmetros de tipo para usted. Esto se conoce como la inferencia de tipos. Para ejemplo, suponer que HashMap siempre que esta fbrica esttica:

    public static HashMap newInstance () { return new HashMap (); }

    Posteriormente, se podra sustituir a la declaracin prolijo arriba con esta alternativa sucinta:

    Map m = HashMap.newInstance ();

    Algn da, el idioma puede realizar este tipo de inferencia de tipos de constructor invocaciones, as como las invocaciones de mtodos, pero como de la liberacin de 1,6, no lo hace.

    www.it-ebooks.info

  • 10 CAPTULO 2 Crear y destruir objetos

    Desafortunadamente, las implementaciones de recogida estndar, tales como HashMap hacer no tienen mtodos de fbrica como de la liberacin de 1,6, pero se puede poner estos mtodos en su propia clase de utilidad. Ms importante an, usted puede proporcionar este tipo de fbricas de

    electricidad esttica en su clases con parmetros propios. La principal desventaja de proporcionar mtodos de fbrica slo estticas es que clases sin constructores pblicos o protegidos no pueden ser subclases. La mismo es cierto para las clases no pblicas devueltos por las fbricas pblicas estticas. Por ejemplo, es imposible crear una subclase de cualquiera de las clases de implementacin de conveniencia en el Marco de Colecciones. Podra decirse que esto puede ser una bendicin disfrazada, ya que fomenta edades programadores utilizar la composicin en vez de la herencia (artculo 16). Una segunda desventaja de los mtodos de fbrica estticas es que no son fcilmente distinguible de otros mtodos estticos. Ellos no se destacan en API documentacin en la forma en que los constructores hacen, por lo que puede ser difcil de entender cmo crear una instancia de una clase que proporciona mtodos de generador estticos en lugar de

    cons- tores. La herramienta Javadoc puede sacar algn da atencin a los mtodos estticos de la fbrica. En Mientras tanto, usted puede reducir esta desventaja, llamando la atencin a la electricidad esttica fac- torios en clase o los comentarios de la interfaz, y mediante la adhesin a nombres comn conven- ciones. Estos son algunos nombres comunes para los mtodos estticos de fbrica:

    valueOf-Devuelve una instancia que tiene, hablando en trminos generales, el mismo valor que su parmetros. Tales fbricas estticas son de tipo de conversin efectivamente mtodos.

    de-Una alternativa concisa para valueOf, Popularizado por EnumSet (Artculo 32).

    getInstance-Devuelve una instancia que se describe por los parmetros, pero no se puede decir que tienen el mismo valor. En el caso de un singleton, getInstance no toma ningn parmetro y devuelve la nica instancia.

    newInstance-Al igual que getInstance, Excepto que newInstance garantiza que cada instancia devuelta es distinta de todas las dems.

    conseguirTipo-Like getInstance, Sino que se utiliza cuando el mtodo de fbrica se encuentra en una dife- clase ent. Tipo indica el tipo de objeto devuelto por el mtodo de fbrica.

    nuevoTipo-Like newInstance, Sino que se utiliza cuando el mtodo de fbrica se encuentra en una dife- clase ent. Tipo indica el tipo de objeto devuelto por el mtodo de fbrica.

    En resumen, los mtodos de generador estticos y constructores pblicos ambos tienen su utiliza, y vale la pena entender sus mritos relativos. Fbricas menudo estticos son pref- erable, por lo que evitar el reflejo de proporcionar constructores pblicos sin antes considerar fbricas estticas.

    www.it-ebooks.info

  • Inciso 2: CONSIDERE UN CONSTRUCTOR cuando se enfrentan con los parmetros del constructor MUCHOS 11

    Tema 2: Considere la posibilidad de un constructor cuando se enfrentan a muchos constructor parmetros

    Fbricas estticos y constructores comparten una limitacin: no escala bien a grande nmero de parmetros opcionales. Consideremos el caso de una clase que representa el Etiqueta de informacin nutricional que aparece en los alimentos envasados. Estas etiquetas tienen

    algunos campos obligatorios-tamao de la porcin, porciones por envase, y las caloras por porcin- y ms de veinte opcional grasa campos-totales, grasas saturadas, grasas trans, colesterol, de sodio, y as sucesivamente. La mayora de los productos tienen valores distintos de cero por slo

    unos pocos de estos campos opcionales. Qu clase de constructores o fbricas estticas debe escribir para una clase de este tipo? Tradicionalmente, los programadores han utilizado el constructor telescpico patrn, en que proporcione un constructor con slo los parmetros, otra con un requeridas solo parmetro opcional, una tercera con dos parmetros opcionales, y as sucesivamente, culminacin rios de un constructor con todos los parmetros opcionales. As es como se ve en prctica. Para ser breves, slo cuatro campos opcionales se indican:

    Patrn constructor / / telescpico - no escala bien! NutritionFacts public class { int final privado servingSize ;/ / (ml) requiere raciones privadas finales int ;/ / (por contenedor) requirieron caloras int final privado ;/ / opcional final privado int grasa ;/ / (g) opcional private int final de sodio ;/ / (mg) opcional carbohidratos final int privado; / / (G) opcional

    NutritionFacts pblicas (int servingSize, int porciones) { esto (servingSize, porciones, 0); }

    NutritionFacts pblicos (int servingSize, int porciones, int caloras) { esto (servingSize, porciones, caloras, 0); }

    NutritionFacts pblicos (int servingSize, int porciones, int caloras, grasa int) { esto (servingSize, porciones, caloras, grasa, 0); }

    NutritionFacts pblicos (int servingSize, int porciones, int caloras, grasa int, int sodio) { esto (servingSize, porciones, caloras, grasa, sodio, 0); }

    www.it-ebooks.info

  • 12 CAPTULO 2 Crear y destruir objetos

    NutritionFacts pblicos (int servingSize, int porciones, int, int caloras de grasa, sodio int, int carbohidratos) { this.servingSize = servingSize; this.servings = porciones; this.calories = caloras; this.fat = grasa; this.sodium = de sodio; this.carbohydrate = hidratos de carbono; }

    }

    Cuando desea crear una instancia, se utiliza el constructor con el menor lista de parmetros que contiene todos los parmetros que desea configurar:

    NutritionFacts cocacola = nuevos NutritionFacts (240, 8, 100, 0, 35, 27);

    Normalmente esta invocacin constructor requerir muchos parmetros que usted no lo hace desea ajustar, pero te ves obligado a pasar un valor para ellos de todos modos. En este caso, pasado un valor de 0para grasa. Con "slo" seis parmetros Esto puede no parecer tan malo, pero pronto se le va de las manos como el nmero de parmetros aumenta. En resumen, el patrn constructor telescpica funciona, pero es difcil escribir cdigo de cliente cuando hay muchos parmetros, y ms difcil todava lo lean. La lector se queda preguntndose qu significan todos esos valores, y debe contar con atencin parmetros para averiguar. Secuencias largas de parmetros de forma idntica con tipo pueden causar errores sutiles. Si el cliente invierte accidentalmente dos de tales parmetros, el compilador No se quejar, pero el programa se portan mal en tiempo de ejecucin (artculo 40). Una segunda alternativa cuando se enfrentan con muchos parmetros de constructor es la JavaBeans patrn, en el que se llama a un constructor sin parmetros para crear el objeto y luego llamar a los mtodos setter para configurar cada parmetro requerido y cada uno parmetro opcional de inters:

    / / JavaBeans Patrn - permite la inconsistencia, mandatos mutabilidad NutritionFacts public class { / / Parmetros inicializan a valores por defecto (si los hay) private int servingSize = -1; / / Necesario; ningn valor predeterminado porciones private int = -1; / / "" "" caloras private int = 0; int grasa privado = 0; int sodio privada = 0; int carbohidratos privado = 0;

    NutritionFacts pblicas () {}

    www.it-ebooks.info

  • Inciso 2: CONSIDERE UN CONSTRUCTOR cuando se enfrentan con los parmetros del constructor MUCHOS 13

    / / Setters public void public void public void public void public void public void

    }

    setServingSize (int val) setServings (int val) setCalories (int val) setFat (int val) setSodium (int val) setCarbohydrate (int val)

    { { { { { {

    servingSize = val; } porciones = val; } caloras = val; } grasa = val; } sodio = val; } hidratos de carbono = Val; }

    Este patrn tiene ninguna de las desventajas del patrn constructor telescpico. Es fcil, aunque un poco prolijo, para crear instancias, y fcil de leer el cdigo resultante:

    NutritionFacts cocacola = new NutritionFacts (); cocaCola.setServingSize (240); cocaCola.setServings (8); cocaCola.setCalories (100); cocaCola.setSodium (35); cocaCola.setCarbohydrate (27);

    Desafortunadamente, el patrn de JavaBeans tiene graves desventajas de su propia. Debido a que la construccin se divide en varias llamadas, un JavaBean puede estar en una estado inconsistente hasta la mitad a travs de su construccin. La clase no tiene la opcin de hacer cumplir la consistencia simplemente comprobando la validez de la con- parmetros Structor. Intentar utilizar un objeto cuando est en un estado incoherente puede causar fallas que estn muy lejos de el cdigo que contiene el error, por lo tanto, difcil de depurar. Una desventaja es que relacionados el patrn de JavaBeans pre- cluye la posibilidad de hacer una clase inmutable (Artculo 15), y requiere aadido de esfuerzo por parte del programador para garantizar la seguridad para subprocesos. Es posible reducir estos inconvenientes manualmente "congelar" el objeto cuando su construccin est completa y no lo que le permite ser utilizado hasta que se congele, pero esta variante es difcil de manejar y rara vez se utiliza en la prctica. Por otra parte, puede causar

    errores en tiempo de ejecucin, ya que el compilador no puede garantizar que el programador llama a la

    congelacin mtodo en un objeto antes de usarlo. Afortunadamente, hay una tercera alternativa que combina la seguridad de la telescpica patrn constructor con la legibilidad del patrn de JavaBeans. Es una forma de la Constructor patrn [Gamma95, p. 97]. En lugar de hacer el objeto deseado directamente, el cliente llama a un constructor (o de fbrica esttica) con todos los parmetros necesarios y consigue un objeto constructor. A continuacin, el cliente llama a los mtodos setter-como en el constructor oponerse a ajustar cada parmetro opcional de inters. Por ltimo, el cliente llama a un parmetro terless construir mtodo para generar el objeto, que es inmutable. El constructor es un clase miembro esttico (artculo 22) de la clase que construye. As es como se ve en la prctica:

    www.it-ebooks.info

  • 14 CAPTULO 2 Crear y destruir objetos

    / / Patrn Constructor NutritionFacts public class { servingSize final int privado; porciones int final privado; caloras int final privado; grasa final int privado; int final de sodio privado; carbohidratos final int privado;

    public class constructor static { / / Parmetros requeridos servingSize final int privado; porciones int final privado;

    / / Opcional private int private int private int private int

    parmetros - inicializado a los valores por defecto caloras = 0; grasas = 0; hidratos de carbono = 0; de sodio = 0;

    Constructor pblico (int servingSize, int porciones) { this.servingSize = servingSize; this.servings = porciones; }

    caloras Builder pblico (int val) {Caloras = val; devuelva este; grasa Constructor pblico (int val) {Grasa = val; devuelva este; Constructor pblico carbohidratos (int val) {Carbohidratos = Val; devuelva este; Constructor pblico de sodio (int val) {Sodio = val; devuelva este;

    NutritionFacts pblicas construyen () { volver nuevos NutritionFacts (this); }

    }

    NutritionFacts privado (Constructor Constructor) { servingSize = builder.servingSize; porciones = builder.servings; caloras = builder.calories; grasa = builder.fat; sodio = builder.sodium; carbohidratos = builder.carbohydrate; }

    }

    }

    }

    }

    }

    www.it-ebooks.info

  • Inciso 2: CONSIDERE UN CONSTRUCTOR cuando se enfrentan con los parmetros del constructor MUCHOS 15

    Tenga en cuenta que NutritionFacts es inmutable, y que todos los valores por defecto de los

    parmetros se encuentran en un solo lugar. Mtodos de establecimiento del constructor devuelven el propio

    generador para que las invocaciones se pueden encadenar. As es como se ve el cdigo de cliente:

    NutritionFacts cocacola = new NutritionFacts.Builder (240, 8). ... caloras (100) de sodio (35) de hidratos de carbono (27) construccin ();

    Este cdigo de cliente es fcil de escribir y, sobre todo, para leer. El Generador de pat- simula tern llamados parmetros opcionales como se encuentra en Ada y Python. Al igual que un constructor, un constructor puede imponer invariantes en sus parmetros. La construir mtodo puede comprobar estos invariantes. Es crtico que ser comprobados despus de copia de los parmetros del constructor para el objeto, y que se pueden verificar en los campos del objeto en lugar de los campos de generador (Tema 39). Si alguno de los invariantes

    son vio- Lated, la construir mtodo debe lanzar una IllegalStateException (Artculo 60). La mtodo de detalle de excepcin debe indicar qu invariante es violado (artculo 63). Otra forma de imponer invariantes que involucran a mltiples parmetros es tener mtodos setter toman grupos enteros de parmetros en los que algunos deben invariante sostener. Si el invariante no se cumple, el mtodo setter lanza una IllegalArgu- mentException. Esto tiene la ventaja de detectar el fallo invariante tan pronto como se pasan los parmetros no vlidos, en lugar de esperar a que construir que se invoca. La menor ventaja de los constructores sobre los constructores es que los constructores pueden tener

    mul- tiple VarArgs parmetros. Constructores, al igual que los mtodos, slo puede tener un varargs parmetro. Debido a que los constructores utilizan mtodos distintos para configurar cada parmetro,

    que pueden tienen hasta VarArgs parmetros a su gusto, hasta uno por mtodo setter. El patrn Builder es flexible. Un nico constructor puede ser usado para construir mltiples objetos. Los parmetros del constructor pueden ser ajustados entre las creaciones de objetos a variar los objetos. El constructor puede rellenar algunos campos automticamente, como una serie cifra que se incrementa de forma automtica cada vez que se crea un objeto. Un constructor cuyos parmetros se han establecido hace una multa Abstract Factory [Gamma95, p. 87]. En otras palabras, un cliente puede pasar un constructor de este tipo a un mtodo

    para habilitar el mtodo para crear uno o ms objetos para el cliente. Para habilitar esta uso, se necesita un tipo para representar el constructor. Si est utilizando versin 1.5 o una despus suelte, un tipo genrico simple (artculo 26) es suficiente para todo constructores, no importa qu tipo de objeto que estn construyendo:

    / / Un constructor de objetos de tipo T interfaz pblica Constructor { T build pblica (); }

    www.it-ebooks.info

  • 16 CAPTULO 2 Crear y destruir objetos

    Tenga en cuenta que nuestra NutritionFacts.Builder clase podra ser declarada de implementar Constructor . Los mtodos que toman una Constructor ejemplo sera restringen normalmente el constructor de tipo de parmetro usando un tipo comodn acotada (Artculo 28). Por ejemplo, aqu hay una mtodo que genera un rbol utilizando un cliente proporcionado por Constructor instancia para

    construir cada nodo:

    rbol buildTree (Generador de

  • TEMA 3: HACER CUMPLIR LA SINGLETON PROPIEDAD CON UN CONSTRUCTOR PRIVADO O UN TIPO ENUM 17

    Tema 3: Hacer cumplir la propiedad singleton con un privado constructor o un tipo de enumeracin

    Lasemifallo es simplemente una clase que se crea una instancia exactamente una vez [Gamma95, p. 127]. Singleton representan tpicamente un componente del sistema que es intrnsecamente nico, tales como el gestor de ventanas o sistema de archivos. Hacer una clase singleton puede hacen que sea difcil para poner a prueba a sus clientes, ya que es imposible sustituir una imple-simulacro cin de un producto nico a menos que implementa una interfaz que sirve como su tipo. Antes de la liberacin 1.5, haba dos maneras de implementar singletons. Ambos son sobre la base de mantener el constructor privado y exportacin de un miembro pblico esttico proporcionar acceso a la nica instancia. En un enfoque, el miembro es un campo final:

    / / Singleton con el campo public final public class Elvis { public static final de Elvis Elvis INSTANCIA = new (); Elvis privado () {...}

    public void leaveTheBuilding () {...} }

    El constructor privado se llama slo una vez, para inicializar el campo public static final Elvis.INSTANCE. La falta de un constructor pblico o protegido garantas un Universo "monoelvistic": exactamente un Elvis existir una vez que la instancia Elvis clase se inicializa-ni ms, ni menos. Nada de lo que un cliente no puede cambiar esto, con una salvedad: un cliente privilegiado puede invocar el constructor privado reflexivamente (Artculo 53) con la ayuda de la AccessibleObject.setAccessible mtodo. Si necesario para defenderse de este ataque, modifique el constructor para que sea lanzar una excepto si se le pide que cree una segunda instancia. En el segundo enfoque para la aplicacin de singletons, el miembro del pblico es un mtodo de fbrica esttica:

    / / Singleton con fbrica esttica public class Elvis { privado static final Elvis INSTANCIA = new Elvis (); Elvis privado () {...} static Elvis getInstance () {Return INSTANCIA; }

    public void leaveTheBuilding () {...} }

    Todas las llamadas a Elvis.getInstance devolver la misma referencia de objeto, y no hay otra Elvis instancia ser jams creado (con la misma salvedad mencionada anteriormente).

    www.it-ebooks.info

  • 18 CAPTULO 2 Crear y destruir objetos

    La principal ventaja de la aproximacin del campo pblico es que las declaraciones hacen claro que la clase es un producto nico: el campo public static es final, por lo que siempre contener la misma referencia de objeto. Ya no hay ninguna ventaja de rendimiento a la aproximacin del campo pblico: moderna mquina virtual Java (JVM) implementaciones es casi seguro que inline la llamada al mtodo de fbrica esttica. Una de las ventajas del enfoque de fbrica-mtodo es que le da la flexibilidad- dad para cambiar de opinin acerca de si la clase debe ser un singleton sin cambiando su API. El mtodo de fbrica devuelve la nica instancia, pero podra ser fcilmente modificado para regresar, por ejemplo, una instancia nica para cada subproceso que invoca. Un

    segundo ventaja, en relacin con los tipos genricos, se discute en el artculo 27. A menudo ninguno de estas ventajas son relevantes, y la aproximacin final de campo es ms simple. Para hacer una clase singleton que se implementa utilizando cualquiera de los anteriores enfoques serializable (Captulo 11), que no es suficiente simplemente para aadir imple- mentos serializables a su declaracin. Para mantener la garanta singleton, que tiene que declarar todos los campos de instancia transitorio y proporcionar una readResolve mtodo (Artculo 77). De lo contrario, cada vez que se deserializa una instancia serializada, un nuevo se crear ejemplo, que conduce, en el caso de nuestro ejemplo, para espuria Elvis avistamientos. Para evitar esto, aada esta readResolve mtodo para la Elvis clase:

    / / Mtodo readResolve para preservar la propiedad singleton readResolve private Object () { / / Devuelve el nico y verdadero Elvis y dejar que el recolector de basura / / Cuidar el imitador de Elvis. volver INSTANCIA; }

    Como de la liberacin de 1,5, hay un tercer enfoque para la aplicacin de singletons. Simplemente crea un tipo de enumeracin con un elemento:

    / / Enum singleton - el enfoque preferido public enum Elvis { INSTANCIA;

    public void leaveTheBuilding () {...} }

    Este enfoque es funcionalmente equivalente a la aproximacin del campo pblico, excepto que se es ms conciso, proporciona el mecanismo de serializacin de forma gratuita, y ofrece una garanta rigurosa contra instancias mltiples, incluso en la cara de la sofisticada serializacin o ataques de reflexin. Si bien este enfoque todava tiene que ser ampliamente adoptado, un tipo de enumeracin de un solo elemento es la mejor manera de implementar un singleton.

    www.it-ebooks.info

  • TEMA 4: HACER CUMPLIR CON NONINSTANTIABILITY un constructor privado 19

    Tema 4: Hacer cumplir noninstantiability con un constructor privado

    De vez en cuando usted quiere escribir una clase que es slo una agrupacin de mtodos estticos y campos estticos. Estas clases han adquirido una mala reputacin debido a que algunas personas abusar de ellos para evitar pensar en trminos de objetos, pero tienen usos vlidos. Ellos se puede utilizar para mtodos relacionados con el grupo de valores primitivos o matrices, de la

    manera de java.lang.Math o java.util.Arrays. Ellos tambin se pueden utilizar para esttica grupo mtodos, incluyendo mtodos de fbrica (punto 1), para los objetos que implementan una parti- interfaz de LAR, en la forma de java.util.Collections. Por ltimo, se pueden utilizar a los mtodos de grupo en una clase final, en lugar de extender la clase. Tal clases de utilidad no fueron diseados para ejecutarse: una instancia sera absurdo. En la ausencia de constructores explcitos, sin embargo, el compilador Pro- ciona un pblico, sin parmetros constructor predeterminado. Para un usuario, este constructor es indistinguible de cualquier otro. No es raro ver involuntariamente clases instanciables en API publicadas. El intento de hacer cumplir noninstantiability haciendo una clase abstracta que hace no funciona. La clase puede tener subclases y la subclase instancia. Adems, que induzcan a error al usuario a creer que la clase fue diseada para la herencia (artculo 17). Hay, sin embargo, un lenguaje sencillo para asegurar noninstantiability. A construc-default tor slo se genera si una clase contiene ningn constructor explcitas, por lo que una clase puede

    ser hecho no instanciable al incluir un constructor privado:

    / Clase de utilidad / no instanciable public class UtilityClass { / / Constructor predeterminado para reprimir noninstantiability UtilityClass privado () { throw new AssertionError (); } ... / / El resto omitido }

    Debido a que el constructor explcito es privado, es inaccesible fuera de la clase. La AssertionError No es estrictamente necesario, pero proporciona a los seguros en caso de que el constructor se invoca accidentalmente desde dentro de la clase. Garantiza que la clase nunca se crear una instancia en ningn caso. Este idioma es ligeramente contrario a la intuicin, ya que el constructor est expresamente prevista por lo que no

    puede ser invocado. Por tanto, es conveniente incluir un comentario, como se muestra arriba. Como efecto secundario, este idioma tambin impide que la clase sea una subclase. Todo constructores deben invocar a un constructor de la superclase, explcita o implcitamente, y una subclase no tendra ningn constructor de la superclase accesible a invocar.

    www.it-ebooks.info

  • 20 CAPTULO 2 Crear y destruir objetos

    Tema 5: Evitar la creacin de objetos innecesarios

    A menudo es apropiado volver a utilizar un solo objeto en vez de crear una nueva funcin- objeto aliado equivalente cada vez que sea necesario. La reutilizacin puede ser tanto ms rpido y

    ms con estilo. Un objeto siempre puede volver a utilizar si es inmutable (Punto 15). Como ejemplo extremo de lo que no se debe hacer, considere la siguiente declaracin:

    String s = new String ("stringette"); / / NO HACER ESTO!

    La sentencia crea una nueva Cadena ejemplo cada vez que se ejecuta, y ninguna de esas creaciones de objetos es necesario. El argumento de la Cadena construccin tor ("Stringette") Es en s mismo un Cadena ejemplo, funcionalmente idntico a la totalidad de la objetos creados por el constructor. Si este uso ocurre en un bucle o en una frecuencia mtodo invocado, millones de Cadena casos se pueden crear innecesariamente. La versin mejorada es simplemente el siguiente:

    String s = "stringette";

    Esta versin utiliza un solo Cadena ejemplo, en lugar de crear uno nuevo cada vez que se ejecuta. Adems, se garantiza que el objeto ser reutilizados por cualquier otro cdigo que se ejecuta en la misma mquina virtual que pasa a con- mantener la misma cadena literal [JLS, 3.10.5]. A menudo se puede evitar la creacin de objetos innecesarios mediante el uso de fbrica esttica

    meth- ods (Artculo 1) en lugar de constructores en clases inmutables que proporcionan ambos. Por ejemplo, el mtodo de fbrica esttica Boolean.valueOf (String) es casi siempre preferible al constructor Boolean (String). El constructor crea una nuevo objeto cada vez que se llama, mientras que el mtodo de fbrica esttica nunca se requiere para hacerlo y no lo har en la prctica. Adems de la reutilizacin de objetos inmutables, tambin se puede volver a utilizar los objetos

    mutables si usted sabe que no se pueden modificar. Aqu es un poco ms sutil, y mucho ms comn, ejemplo de lo que no se debe hacer. Implica mutable Fecha objetos que nunca se modifican una vez que se han calculado sus valores. Esta clase modela una persona y tiene un isBabyBoomer mtodo que indica si la persona es un "beb boomer ", en otras palabras, si la persona naci entre 1946 y 1964:

    public class Persona { Fecha de Nacimiento Fecha final privado;

    / / Otros campos, mtodos y constructor omitido

    www.it-ebooks.info

  • TEMA 5: evitar la creacin de objetos innecesarios 21

    / / NO HACER ESTO! isBabyBoomer public boolean () { / / Asignacin innecesaria de objetos caros Calendario gmtCal = Calendar.getInstance (TimeZone.getTimeZone ("GMT")); gmtCal.set (1946, Calendar.JANUARY, 1, 0, 0, 0); Fecha boomStart = gmtCal.getTime (); gmtCal.set (1965, Calendar.JANUARY, 1, 0, 0, 0); Fecha boomEnd = gmtCal.getTime (); volver birthDate.compareTo (boomStart)> = 0 && birthDate.compareTo (boomEnd) = 0 && birthDate.compareTo (BOOM_END)

  • 22 CAPTULO 2 Crear y destruir objetos

    mtodo se invoca con frecuencia. En mi mquina, la versin original tiene 32.000 ms de 10 millones de invocaciones, mientras que la versin mejorada se lleva a 130 ms, que es aproximadamente 250 veces ms rpido. No slo se mejora el rendimiento, pero tambin lo es la

    claridad. Cambio boomStart y boomEnd a partir de variables locales a campos estticos finales hace claro que estas fechas son tratadas como constantes, por lo que el cdigo sea ms entender- capaz. En el inters de la divulgacin completa, el ahorro de este tipo de optimizacin no siempre ser esta dramtica, como Calendario casos son especialmente caros para crear. Si la versin mejorada de la Persona clase es inicializada pero su isBabyBoomer mtodo no se invoca nunca, la BOOM_START y BOOM_END Se inicializan los campos innecesariamente. Sera posible eliminar las inicializaciones innecesarios por perezosamente inicializar estos campos (artculo 71), la primera vez que el isBabyBoomer mtodo es invoca, pero no se recomienda. Como suele ser el caso con la inicializacin perezosa, se complicara la aplicacin y sera poco probable que resulte en un aviso- mejora del rendimiento capaces ms all de lo que ya hemos logrado (artculo 55). En los ejemplos anteriores de este artculo, era obvio que los objetos de que se trata- cin podra ser reutilizado, ya que no se modificaron despus de la inicializacin. Hay otras situaciones en las que es menos obvio. Consideremos el caso de adaptadores [Gamma95, p. 139], tambin conocido como vistas. Un adaptador es un objeto que se delega en un soporte oponerse, que proporciona una interfaz alternativa para el objeto de respaldo. Debido a que un

    adaptador no tiene un estado ms all de su objeto respaldo, no hay necesidad de crear ms de una instancia de un adaptador dado a un objeto dado. Por ejemplo, la conjunto de claves mtodo de la Mapa interfaz devuelve un Conjunto vista de la Mapa oponerse, que consta de todas las claves en el mapa. Ingenuamente, parecera que cada llame al conjunto de claves tendra que crear una nueva Conjunto ejemplo, pero cada llamada a conjunto de claves en un dado Mapa objeto puede devolver el mismo Conjunto instancia. Aunque el vuelto Conjunto instancia es tpicamente mutable, todos los objetos devueltos son Iden-funcionalmente tico: cuando uno de los objetos devueltos cambios, por lo que se puede hacer todos los dems, porque todos estn respaldados por los mismos Mapa instancia. Si bien es inofensiva para crear mltiples instancias de la conjunto de claves Vista del objeto, tambin es innecesario. Hay una nueva forma de crear objetos innecesarios en la versin 1.5. Se llama autoboxing, y permite que el programador se mezcle primitivo y caja primitiva tipos, el boxeo y unboxing automticamente segn sea necesario. Autoboxing desenfoques pero s no borra la distincin entre tipos primitivos primitivos y en caja. Hay distinciones semnticas sutiles, y