Editor de Modelos de programação defensiva
-
22-08-2019 - |
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)
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)
).
SeB
é um subtipo deA
eA
de igual método verifica que o argumento é umainstanceof A
e B de igual método verifica que o argumento é umainstanceof 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.