Pergunta

Recentemente eu trabalhei em FindBugs avisos sobre expor estado interno, ou seja, quando uma referência a uma matriz foi devolvido ao invés de retornar uma cópia da matriz. Eu criei alguns modelos para fazer a conversão de que o código mais fácil.

Qual você criar para apoiar a programação defensiva e quer compartilhar com a multidão SO?

Modelos eu criei até agora (como exemplos):

Para criar uma cópia de uma matriz de retorno de um método:

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

Para clonar um objeto:

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

Solução

Eu gosto de ter como modelo a é igual a "mais seguras" () definição:

 /**
 * 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 ter a certeza de sempre evitar Eq: é igual substituições método Equals na superclasse e pode não ser simétrica (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC), onde:

Esta classe define um método que substitui um método é igual em uma superclasse é igual. Ambos iguala métodos métodos utilizam instanceof na determinação de se os dois objectos são iguais.

Este é cheio de perigo, uma vez que é importante que o método equals é simétrico (em outras palavras, a.equals(b) == b.equals(a)).
Se B é um subtipo de A e A de igual método verifica que o argumento é uma instanceof A e B de igual método verifica que o argumento é uma instanceof B, é bastante provável que a relação de equivalência definida por esses métodos não é simétrica.


Este é apenas para as classes que implementam Comparable e permite:

  • uma implementação de iguais, que é sempre o mesmo;
  • todas as lógicas de comparação a ser localizado em um único lugar (a função compareTo());
  • o cumprimento do javadoc de Comparable#compareTo() pedindo para garantir que (x.compareTo(y)==0) == (x.equals(y)) (fortemente recomendado, mas não estritamente necessário embora).

Outras dicas

Não é um modelo, mas eu uso array.clone() vez de System.arraycopy(). Existe errado alguma coisa com isso?

Edit: Um modelo que eu uso na implementação de um decorador, especialmente para uma interface com muitos métodos:

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

Ele gera uma implementação do método atual, delegando a chamada para uma instância embrulhado, evitando assim erros de copiar / colar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top