Sto sovrascrivendo i metodi equals e hashcode per un oggetto contenitore semplice per due interi. Ogni int riflette l'indice di un altro oggetto (non importa quale sia l'oggetto). Il punto della classe è rappresentare una connessione tra i due oggetti.Sovrascrittura di Java equivale a() e hashcode() per due interi intercambiabili
La direzione della connessione non è importante, pertanto il metodo equals deve restituire true indipendentemente dal modo in cui i due valori si trovano nell'oggetto E.g.
connectionA = new Connection(1,2);
connectionB = new Connection(1,3);
connectionC = new Connection(2,1);
connectionA.equals(connectionB); // returns false
connectionA.equals(connectionC); // returns true
Ecco quello che ho (modificato dal codice sorgente per intero):
public class Connection {
// Simple container for two numbers which are connected.
// Two Connection objects are equal regardless of the order of from and to.
int from;
int to;
public Connection(int from, int to) {
this.from = from;
this.to = to;
}
// Modifed from Integer source code
@Override
public boolean equals(Object obj) {
if (obj instanceof Connection) {
Connection connectionObj = (Connection) obj;
return ((from == connectionObj.from && to == connectionObj.to) || (from == connectionObj.to && to == connectionObj.from));
}
return false;
}
@Override
public int hashCode() {
return from*to;
}
}
Questo funziona però la mia domanda è: C'è un modo migliore per raggiungere questo obiettivo?
La mia preoccupazione principale è con il metodo hashcode() restituirà lo stesso codice hash per ogni due numeri interi che moltiplicano per uguagliare lo stesso numero. Per esempio.
3*4 = 12
2*6 = 12 // same!
La documentazione, http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#hashCode(), afferma che
Non è necessario che se due oggetti non sono uguali secondo le metodo equals (java.lang.Object), quindi chiamare il metodo hashCode su ognuno dei due oggetti deve produrre risultati interi distinti. Tuttavia, il programmatore deve essere consapevole del fatto che la produzione di distinti risultati interi per oggetti non uguali può migliorare le prestazioni degli hash .
Se qualcuno può vedere un modo semplice per ridurre il numero di codici hash corrispondenti, sarei grato di una risposta.
Grazie!
Tim
PS Sono consapevole che c'è una java.sql.Connection che potrebbe causare alcuni fastidi di importazione. L'oggetto ha in realtà un nome più specifico nella mia applicazione, ma per brevità l'ho abbreviato in Connection qui.
Questo non funzionerà in questo caso poiché da e per non è necessariamente uguale. Invece, magari ordinali prima. – ddmps
Ho appena provato questo in Excel. Pescis è corretto, non dà lo stesso res se si scambiano i numeri (a meno che non siano gli stessi). –
@Pescis "non funzionerà", puoi essere più specifico? –