domingo, agosto 21, 2011

Effective Java: Methods Common to All Objects

El capítulo tres de Effective Java explica los métodos que podemos sobrescribir de Object (equals, hashCode, toString, clone y finalize).

En el caso del equals lo más importante es recordar el contrato y las propiedades que este tiene que cumplir lo que provoca que no haya forma de extender una clase instanciable añadiendo un nuevo atributo y seguir cumpliendo el contrato. Para este tipo de situaciones la única solución es optar por la composición en lugar de la herencia (pág 37-41).

El hashCode deberá ser sobrescrito siempre que el equals lo sea y en caso de que este se complicado de calcular podremos optar por usar lazy loading.

El toString debería ser siempre sobrescrito y es aconsejable en según que situaciones explicar claramente en el javadoc del método el formato en el que se devuelve la información. Por ejemplo:
/**

* Returns the string representation of this phone number.
* The string consists of fourteen characters whose format
* is "(XXX) YYY-ZZZZ", where XXX is the area code, YYY is
* the prefix, and ZZZZ is the line number. (Each of the
* capital letters represents a single decimal digit.)
*
* If any of the three parts of this phone number is too small
* to fill up its field, the field is padded with leading zeros.
* For example, if the value of the line number is 123, the last
* four characters of the string representation will be "0123".
*
* Note that there is a single space separating the closing
* parenthesis after the area code from the first digit of the * prefix. */
@Override public String toString() {
return String.format("(%03d) %03d-%04d", areaCode, prefix, lineNumber);
}
En cuanto al clone debemos recordar que si sobrescribimos este método en una clase no-final tendremos que invocar el super.clone(). Otros consejos que da son que las clases inmutables no deberían ofrecer un clone porque generaría otro objecto exactamente igual que el anterior y que no se va a modificar. Y para terminar explica todos los problemas que conlleva este método aconsejando que en ocasiones es más simple ofrecer un copy constructor:
public Yum(Yum yum);
O una copy factory:
public static Yum newInstance(Yum yum);
También hay unas lineas dedicadas al compareTo de la interfaz Comparable y explica el "truco" de devolver la resta cuando comparamos dos números además de explicar que esto no funciona cuando comparamos un números positivo grande y un negativo ya que puede desbordar y devolver un resultado engañoso.

Para terminar finalize no debería ser utilizado.

3 comentarios:

  1. Una cosilla mas referente a equals. SIEMPRE se deberia usar instanceOf en lugar de obj.getClass() y acceder a las propiedades con getXX en lugar de obj.xx para evitar sorpresas.

    A ver si adivinas por que.

    Oscar

    ResponderEliminar
  2. El SIEMPRE de antes era solo para el instanceOf :P

    ResponderEliminar
  3. hola, disculpa no volviste a hacer mas resumenes? estan muy buenos los q hiciste, muchas gracias! :D

    ResponderEliminar