Professional Documents
Culture Documents
Afortunadamente, hay una tercera alternativa que combina la seguridad del patrn
constructor telescpico con la legibilidad del patrn de JavaBeans. Es una forma del patrn
Builder. En lugar de hacer el objeto que desea directamente, el cliente llama a un constructor
(o fbrica esttica) con todos los parmetros exigidos y obtiene un objeto constructor. A
continuacin, el cliente llama a los mtodos setter-como en el objeto constructor para ajustar
cada parmetro opcional de inters. Por ltimo, el cliente llama a un mtodo de aumento sin
parmetros para generar el objeto, que es inmutable.
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
public static class Builder {
// Required parameters
private final int servingSize;
private final int servings;
// Optional parameters - initialized to default values
private int calories = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val)
{ calories = val; return this; }
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).
calories(100).sodium(35).carbohydrate(27).build();
Tema 3: Hacer cumplir la propiedad singleton con un constructor privado o un tipo de
enumeracin
Un singleton es simplemente una clase que se crea una instancia exactamente una vez.
Singletons representan tpicamente un componente del sistema que es intrnsecamente nico,
como el gestor de ventanas o sistema de archivos.
Nada de un cliente puede cambiar esto, con una salvedad: un cliente privilegiado puede
invocar el constructor privado reflexivamente con la ayuda del mtodo
AccessibleObject.setAccessible.
La principal ventaja del enfoque campo pblico es que las declaraciones dejan claro que la
clase es un singleton: el campo public static es final, por lo que siempre contendr la misma
referencia de objeto.
Una de las ventajas del enfoque de fbrica mtodo es que le da la flexibilidad para cambiar de
opinin acerca de si la clase debe ser un singleton sin cambiar su API. Para mantener la
garanta singleton, usted tiene que declarar todas las instancias de campos transitorios y
proporcionar un mtodo readResolve.
Si bien este enfoque an no se ha adoptado ampliamente, un tipo de enumeracin de un solo
elemento es la mejor manera de poner en prctica un singleton.
Item 4: Hacer cumplir no instanciabilidad con un constructor privado
Se pueden utilizar los mtodos relacionados con el grupo sobre los valores primitivos o
matrices, a la manera de java.lang.Math o java.util.Arrays. Ellos tambin se pueden utilizar
para agrupar mtodos estticos, incluyendo mtodos de fbrica, para los objetos que
implementan una interfaz en particular, a la manera de java.util.Collections. Por ltimo,
pueden ser usados para mtodos de grupo en una clase final, en lugar de extender la clase.
El intento de hacer cumplir noninstantiability haciendo una clase abstracta no funciona. La
clase puede tener subclases y la subclase instancia. Adems, se engaa al usuario hacindole
creer a la clase fue diseada para la herencia
Hay, sin embargo, un lenguaje sencillo para asegurar noninstantiability. Se genera un
constructor por defecto slo si una clase no contiene constructores explcitas, por lo que una
clase se puede hacer no instanciable al incluir un constructor privado
public class UtilityClass {
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
No se invoca por ser privado en subclases y el assert por dentro. Como efecto
secundario, este idioma tambin evita la clase de ser subclase.
Item 5: Evitar la creacin de objetos innecesarios
A menudo es apropiado volver a utilizar un solo objeto en vez de crear un nuevo objeto
funcionalmente equivalente cada vez que sea necesario. La reutilizacin puede ser tanto ms
rpido y ms elegante. Un objeto siempre puede volver a utilizar si es inmutable. A menudo se
puede evitar la creacin de objetos innecesarios mediante el uso de mtodos de fbrica
estticos en preferencia a los constructores de las clases inmutables que proporcionan ambos.
Adems de la reutilizacin de objetos inmutables, tambin se puede reutilizar objetos
mutables si usted sabe que no se pueden modificar.
La versin mejorada de la clase Persona crea Calendario, zona horaria, y los casos la fecha slo
una vez, cuando se inicializa, en lugar de crear ellos cada vez isBabyBoomer se invoca. Esto da
lugar a significativas mejoras de rendimiento si el mtodo es invocado frecuentemente.
No slo es un rendimiento mejorado, pero tambin lo es la claridad. Cambiando boomStart y
boomEnd de variables locales a campos static final deja claro que estas fechas son tratadas
como constantes, por lo que el cdigo sea ms comprensible.
prefieren primitivas a primitivas en caja, y cuidado con los autoboxing no intencional. El no
poder hacer copias de defensa cuando sea necesario puede conducir a errores insidiosos y
agujeros de seguridad; la creacin de objetos innecesariamente solamente afecta estilo y
rendimiento.
Item 6: Evitar la creacin de objetos innecesarios
Entonces, dnde est la prdida de memoria? Si una pila crece y luego se encoge, los objetos
que se hicieron estallar de la pila no sern basura recogida, incluso si el programa que usa la
pila no tiene ms referencias a ellos. Esto es porque la pila mantiene referencias obsoletas a
estos objetos. Una referencia obsoleta es simplemente una referencia que nunca se eliminan
las referencias de nuevo. En este caso, todas las referencias fuera de la "parte activa" de la
matriz de elemento son obsoletos. La parte activa se compone de los elementos cuyo ndice es
menor que el tamao.
La solucin para este tipo de problema es simple: referencias nulas fuera una vez que se
vuelven obsoletos. En el caso de nuestra clase Pila, la referencia a un elemento se convierte
obsoleta tan pronto como se le hizo estallar de la pila.
Un beneficio adicional de anulando las referencias obsoletas es que, si son posteriormente
desreferenciados por error, el programa fallar inmediatamente con un NullPointerException,
en lugar de hacerlo en silencio las cosas mal. Siempre es beneficioso para detectar errores de
programacin tan pronto como sea posible. La mejor manera de eliminar una referencia
obsoleta es dejar que la variable que contiene la cada de referencia fuera de alcance. Esto
ocurre de forma natural si se define cada variable en la ms estrecha grado posible
Otra fuente comn de prdidas de memoria es cachs. Una vez que usted pone una referencia
de objeto en una cach, es fcil olvidar que est ah y dejarlo en la cach mucho despus de
que se vuelve irrelevante. Una tercera fuente comn de prdidas de memoria es oyentes y
otras devoluciones de llamada.
Si implementa una API donde el cliente se registren devoluciones de llamada, pero no darse de
baja de forma explcita, ellas se acumularn a menos que tome alguna accin. La mejor
manera de garantizar que las devoluciones de llamada son basura recogida rpidamente es
almacenar referencias dbiles solamente a ellos, por ejemplo, mediante el almacenamiento de
ellos slo como claves en un WeakHashMap.
Item 7: evite Finalizadores
Finalizadores son impredecibles, a menudo peligroso, y generalmente innecesario. Su uso
puede provocar un comportamiento errtico, bajo rendimiento y problemas de portabilidad.
nunca se debe hacer en tiempo crtico un finalizador. Simplemente proporcione un mtodo de
terminacin explcito, y requieren los clientes de la clase para invocar este mtodo en cada
instancia cuando ya no es necesaria. Mtodos de terminacin explcitos se utilizan
normalmente en combinacin con la terminacin try-finally construir para asegurar.
En resumen, no utilice finalizadores excepto como una red de seguridad o de suspender los
recursos nativos no crticos. En aquellos casos excepcionales en los que usted hace uso de un
finalizador, recuerde que debe invocar super.finalize. Si utiliza un finalizador como red de
seguridad, recuerde registrar el uso no vlido desde el finalizador. Por ltimo, si usted necesita
para asociar un finalizador con una clase pblica no final, considere el uso de un tutor
finalizador, por lo que la finalizacin puede tener lugar incluso si un finalizador subclase no
invocar super.finalize.
MTODOS COMUNES PARA TODOS LOS OBJETOS
Tema 8: Obedecer el contrato general, cuando se sobreescriben iguales
Cada instancia de la clase es de por s nico. Esto es cierto para las clases tales como hilo que
representan entidades activas en lugar de valores. La implementacin equals proporcionada
por objeto tiene exactamente el comportamiento adecuado para estas clases.
No importa si la clase proporciona una prueba de la "igualdad lgica". Por ejemplo,
java.util.Random podra haber sobreescrito equals para comprobar si dos instancias aleatorias
produciran la misma secuencia de nmeros aleatorios a futuro, pero los diseadores no crea
que los clientes podran necesitar o desear esta funcionalidad. Bajo estas circunstancias, la
aplicacin equals heredado de Object es adecuada.
La clase es privada o paquete - privado, y usted est seguro de que no se invocar su mtodo
equals. Podra decirse que el mtodo equals debe ser sobreescrito bajo estas circunstancias,
en caso de que se invoca por accidente:
Una clase de valor es simplemente una clase que representa un valor, como enteros o Fecha.
Un programador que compara las referencias a los objetos de valor que utilizan mtodo equals
espera saber si son lgicamente equivalentes, no si se refieren al mismo objeto. Cuando se
reemplaza el mtodo equals, debe cumplir con su contrato general.
El mtodo equals implementa una relacin de equivalencia. Es:
Reflexiva: Para cualquier valor de referencia no nulo x, x.equals (x) deben devolver true.
simtrica: Para cualquier valor de referencia no nulos x e y, x.equals (y) debe devolver
verdadero si y slo si y.equals (x) devuelve true.
Transitiva: Para cualquier no nulos valores de referencia x, y, z, si x.equals (y) devuelve true y
y.equals (z) devuelve true, entonces x.equals (z) deben devolver true.
Consistente: Para cualquier valor de referencia no nulos x e y, mltiples invocaciones de
x.equals (y) constantemente return true o consistentemente return false, no proporcion
informacin utilizada en comparaciones equals en los objetos se modifica.
Para cualquier valor de referencia no nulo x, x.equals (null) debe devolver false.
El principio de sustitucin Liskov dice que cualquier propiedad importante de un tipo tambin
debe mantenerlo en los subtipos, de modo que cualquier mtodo escrito para el tipo debera
funcionar igual de bien en sus subtipos
Para tener un mtodo equals de calidad
Utilice el operador == para comprobar si el argumento es una referencia a este objeto.
Utilice el operador instanceof para comprobar si el argumento tiene el tipo correcto.
Cast el argumento con el tipo correcto.
Para cada campo "significativo" en la clase, compruebe si ese campo de la argumentacin
coincide con el campo correspondiente de este objeto.
Cuando haya terminado de escribir el mtodo equals, hgase tres preguntas: es simtrica?
Es transitiva? Es coherente?
Advertencias:
Siempre anular hashCode cuando se sobreescribe equals. No trates de ser demasiado
inteligente. No sustituya otro tipo de objeto en la declaracin de equals
7 Mtodos
Artculo 38: Compruebe los parmetros de validez. . . . . . . . . . . . . . . . . . . . . 181
Artculo 39: Haga copias de defensa cuando sea necesario. . . . . . . . . . . . . . . . 184
Artculo 40: Mtodo de Diseo Firmas cuidado. . . . . . . . . . . . . . . . . 189
Artculo 42: El uso varargs juiciosamente. . . . . . . . . . . . . . . . . . . . . . . . . . 197
Artculo 43: Regreso matrices vacas o colecciones, no nulos. . . . . . . . . 201
Artculo 44: Escribir comentarios de documentacin para todos los elementos expuestos API
8 Programacin general
Artculo 45: Reducir al mnimo el alcance de las variables locales
Artculo 46: Prefiero for-each bucles a lo tradicional bucles. . . . . . . . . 212
Artculo 47: Conocer y utilizar las bibliotecas. . . . . . . . . . . . . . . . . . . . . . . 215
Artculo 48: Evitar el flotador y el doble si se requieren respuestas exactas
Artculo 49: Prefiero tipos primitivos a primitivas en caja. . . . . . . . . . . 221
Artculo 50: Evite cadenas donde otros tipos son ms apropiadas. . 224
Artculo 51: Cuidado con el rendimiento de la concatenacin de cadenas. . . . . . 227
Artculo 52: Consulte objetos por sus interfaces. . . . . . . . . . . . . . . . . 228
Artculo 53: Prefiero interfaces a las la reflexin. . . . . . . . . . . . . . . . . . . . . 230
Artculo 54: Use mtodos nativos con criterio. . . . . . . . . . . . . . . . . . . . 233
Artculo 55: Optimizar juiciosamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Artculo 56: Se adhieren a las convenciones de nombres generalmente aceptados.
excepciones
Artculo 57: Utilice excepciones slo para condiciones excepcionales. . . . . . . 241
Artculo 58: Uso comprueba excepciones para condiciones recuperables y excepciones de
tiempo de ejecucin de errores de programacin
Artculo 59: Evite el uso innecesario de excepciones comprobadas. . . . . . . . 246
Artculo 60: Favorecer el uso de excepciones estndar. . . . . . . . . . . . . . . . 248
Artculo 61: Lance excepciones apropiadas a la abstraccin. . . . . . . 250
Artculo 62: Documentar todas las excepciones lanzadas por cada mtodo. . . . . . 252
Artculo 63: Incluir informacin fracaso de captura en los mensajes detalle
Artculo 64: Luchar por la atomicidad fracaso. . . . . . . . . . . . . . . . . . . . . . . 256
Artculo 65: No ignore excepciones. . . . . . . . . . . . . . . . . . . . . . . . . 258
Concurrencia
Artculo 66: Sincronizar el acceso a los datos mutables compartidos. . . . . . . . . . . 259
Tema 67: Evitar la sincronizacin excesiva. . . . . . . . . . . . . . . . . . 265
Artculo 68: Prefiero ejecutores y tareas a hilos. . . . . . . . . . . . . . . . 271
Artculo 69: Prefiero utilidades de concurrencia que esperar y notificar. . . . . . . 273
Artculo 70: Documento de seguridad hilo. . . . . . . . . . . . . . . . . . . . . . . . . . 278
Artculo 71: Utilice la inicializacin perezosa juiciosamente. . . . . . . . . . . . . . . . . . 282
Artculo 72: No depende del planificador de hilos. . . . . . . . . . . . . . . 286
Artculo 73: Evite grupos de hilos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Publicacin por entregas
Artculo 74: Implementar Serializable juiciosamente. . . . . . . . . . . . . . . 289
Artculo 75: Considere el uso de un formulario serializado personalizado.
Artculo 76: Escribir mtodos readObject defensivamente. . . . . . . . . . . . . 302
Artculo 77: Para el control de instancias, prefieren tipos de enumeracin a readResolve
Artculo 78: Considere proxies de serializacin en lugar de instancias serializados.