Pregunta

Recientemente trabajé en FindBugs advertencias acerca de la exposición de estado interno, es decir, cuando se devuelve una referencia a una matriz en lugar de devolver una copia de la matriz. He creado algunas plantillas para hacer la conversión de que el código sea más fácil.

¿Cuál qué creó para apoyar la programación defensiva y desea compartir con la multitud SO?

plantillas que he creado hasta el momento (como ejemplo):

Para crear una copia de una matriz para volver de un método:

final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );

Para clonar un objeto:

(${o}!= null?(${type})${o}.clone():null)
¿Fue útil?

Solución

Me gusta tener como plantilla una definición "más seguro" es igual a ():

 /**
 * Implement equals based on ${cursor}. <br />
 * See {@link #compareTo(Object) compareTo}
 * @see java.lang.Object#equals(java.lang.Object)
 */
public boolean equals(final Object anObject)
{
    boolean res = false;
    if(anObject == null) { return false; }
    if(anObject == this) { return true; }
    if(anObject.getClass() == this.getClass())
    {
        res = this.compareTo(anObject) == 0;
    }
    return res;
}

Para asegurarse de evitar siempre ecuación: es igual a las anulaciones método es igual en superclase y pueden no ser simétrica (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC), donde:

  

Esta clase define un método que anula un método es igual en una superclase es igual. Tanto es igual a métodos métodos utilizan instanceof en la determinación de si dos objetos son iguales.

     

Esto está lleno de peligros, ya que es importante que el método equals es simétrica (en otras palabras, a.equals(b) == b.equals(a)).
  Si B es un subtipo de A, y A de igual método comprueba que el argumento es un instanceof A, y B de igual método comprueba que el argumento es un instanceof B, es bastante probable que la relación de equivalencia es definida por estos métodos no es simétrica.


Esto es sólo para las clases que implementan Comparable y permite:

  • una implementación de igual a igual, que es siempre la misma;
  • todas las lógicas de comparación para estar situados en un solo lugar (la función compareTo());
  • el cumplimiento de la javadoc de Comparable#compareTo() pidiendo para asegurar que (x.compareTo(y)==0) == (x.equals(y)) (muy recomendable, pero no es estrictamente necesario sin embargo).

Otros consejos

No es una plantilla, pero yo uso array.clone() en lugar de System.arraycopy(). ¿Hay algo de malo en eso?

Editar: Una plantilla que uso cuando la aplicación de un decorador, especialmente para una interfaz con muchos métodos:

wrapped.${enclosing_method}(${enclosing_method_arguments})

Se genera una implementación del método actual mediante la delegación de la llamada a una instancia envuelto, evitando así errores de copiar / pegar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top