Questo è un modo terribile per verificare l'uguaglianza, soprattutto perché gli oggetti non devono essere uguali per restituire lo stesso codice hash.
È necessario utilizzare sempre il metodo di uguale.
La regola generale è:
Se il metodo equals restituisce true per gli oggetti A e B, il metodo hashCode deve tornare lo stesso valore per ae b.
Ciò non significa che se il metodo hashCode per a e b restituisce lo stesso valore, lo stesso valore deve essere restituito true per queste due istanze .
per esempio:
public int hashCode(){
return 5;
}
è una valida, sia se è inefficiente, implementazione codice hash.
EDIT:
di utilizzarlo all'interno di un uguale metodo sarebbe qualcosa di simile:
public class Person{
private String name;
public Person(String name){ this.name = name;}
public String getName(){ return this.name;}
@Override
public boolean equals(Object o){
if (!(o instanceof Person)){ return false;}
Person p = (Person)o;
boolean nameE = this.name == null ? p.getName() == null : this.name.equals(p.getName());
boolean hashE = nameE ? true : randomTrueOrFalse();
// the only moment you're sure hashE is true, is if the previous check returns true.
// in any other case, it doesn't matter whether they are equal or not, since the nameCheck returns false, so in best case, it's redundant
return nameE && hashE;
}
@Override
public int hashCode(){
int hash = generateValidHashCode();
return hash;
}
}
Sta confrontando hashCode l'unica cosa che hai intenzione di fare lì? O solo uno dei tanti passaggi? – Thilo
Non ho intenzione di usarlo, volevo solo lanciarmi l'idea dal momento che il mio istruttore all'unico ha semplicemente detto "non farlo" ma non so spiegare perché. – k4kuz0