Reino: API Abuse

Uma API é um contrato entre quem chama e o que se chama. As formas mais comuns de abuso de API ocorrem quando o responsável pela chamada não respeita sua parte do contrato. Por exemplo, se um programa não chama chdir() após chamar chroot(), ele viola o contrato que especifica como alterar o diretório raiz ativo de forma segura. Outro bom exemplo de abuso de biblioteca é esperar que o elemento chamado retorne informações confiáveis de DNS ao responsável pela chamada. Nesse caso, o responsável pela chamada abusa a API do elemento chamado ao fazer certas suposições sobre seu comportamento (isto é, que o valor de retorno pode ser usado para fins de autenticação). A outra parte também pode violar o contrato entre quem chama e o que se chama. Por exemplo, se um programador definir SecureRandom como subclasse e retornar um valor não aleatório, o contrato será violado.

Object Model Violation: Just one of equals() and hashCode() Defined

Abstract
Essa classe substitui apenas equals() ou hashCode().
Explanation
Espera-se que objetos Java obedeçam a uma série de invariantes relacionadas a igualdade. Uma dessas invariantes é que os objetos iguais devem ter códigos hash iguais. Em outras palavras, se a.equals(b) == true, a.hashCode() == b.hashCode().

A falha em manter essa invariante provavelmente causará problemas se objetos dessa classe forem armazenados em uma coleção. Se os objetos da classe em questão forem usados como uma chave em uma tabela de hash ou se forem inseridos em um Mapa ou Conjunto, é fundamental que objetos iguais tenham códigos hash iguais.

Exemplo 1: A classe a seguir substitui equals(), mas não hashCode().


public class halfway() {
public boolean equals(Object obj) {
...
}
}
References
[1] D. H. Hovermeyer FindBugs User Manual
[2] MET09-J. Classes that define an equals() method must also define a hashCode() method CERT
[3] Standards Mapping - Common Weakness Enumeration CWE ID 581
desc.structural.java.object_model_violation_just_one_of_equals_hashcode_defined