Newsgroup: it.comp.java
Titolo: Metodo equals(): ma quando viene interpellato ?

Ho ridefinito il metodo equals di una classe che estende un HashSet in
questo modo:
  public boolean equals(Object o){
	if (o != null && getClass() == o.getClass())
	{	
	 	WebPage wp = (WebPage) o;
	 	return url.equals(wp.url);	
  	}  	
	else {
 
		return false;
	}
  }
Ho provato poi ad inserire un comando System.out.println("Qui è
falso"); nel blocco <else>,ho inserito i vari oggetti in un Vector e
ho lanciato un vettore.contains(stringa), quindi un oggetto che
dovrebbe causare l'esecuzione del blocco <else>.... ma (sigh!) non lo
esegue !!! 
Con le varie prove ho cobstatato che il metodo riscritto non viene
preso in consideraizone se non passo un oggetto WebPage al metodo
contains ( equindi anche a indexOf, ecc).
Mi sta sfuggendo qualcosa ??
Ciao.
Luigi

Mi sta sfuggendo qualcosa ??
Sì, ti sfugge qualcosa :-)
Dai un'occhiata al codice di Vector.indexOf() ad esempio.
Lo trovi nella dir del tuo jdk.
Immagina di invocare
v.indexOf(o);
ciò che viene eseguito è
o.equals(elementoNelVettore);
Cioè l'equals eseguito non è quello che tu hai ridefinito, ma quello 
dell'oggetto che passi a indexOf().
Coerentemente, solo quando passi un WebPage, il tuo metodo viene 
eseguito :-). E ancora coerentemente non esegue mai l'else :-)
Prova a giocare un po' con questa schifezza di codice che ho messo 
insieme
import java.util.*;
public class WebPage extends HashSet {
    private String url;
    public WebPage(String url) {
        super();
        this.url = url;
    }
    public boolean equals(Object o) {
        if((o != null) && (o.getClass() == getClass())) {
            WebPage p = (WebPage)o;
            boolean res = this.url.equals(p.url);
            System.out.println("Sono della stessa classe, ma " + res);
            return res;
        } else {
            System.out.println("Classi diverse");
            return false;
        }
    }
    public static void main(String[] args) {
        Vector v = new Vector();
        v.add("PIPPO");
        for(int i = 0; i < 10; i++) {
            v.add(new WebPage(String.valueOf(i)));
        }
        WebPage e = new WebPage("eccolo");
        v.add(e);
        System.out.println("Indice che c'è' " + v.indexOf(e));
        Integer s = new Integer(3);
        System.out.println("Indice non c'e' " + v.indexOf(s));
        System.out.println("Confronto diretto " + e.equals(s));
    }
}
HTH
-- 
Ciao
	Fabrizio C.

 [CUT]
Hei !! Non permetterti più di chiamare schifezza il tuo codice
chiarificatore !!! Intesi ??   :-)
Comunque mi è tutto chiaro ora e il particolare che mi sfuggiva era
determinante e poco intuibile ovvero che viene eseguito il metodo
equals in questo modo: o.equals(elementoNelVettore);
Quindi in questi casi non rimane altro da fare che costruire un
oggetto della classe di cui si è fatto l'override, impostare il campo
interessato al confronto e passarlo come elemento da cercare.
Giusto? 
Ti ringrazio tantissimo.
Ciao.
Lugi

Giusto? 
Un confronto (in generale) ha senso solo fra oggetti della stessa 
classe, no? In particolare l'uguaglianza (equals).
Oppure spiega un po' di piů :-)
Anche se posso immaginarlo, non mi č del tutto chiaro cosa vuoi 
ottenere. Prova a raccontarci un po': magari ti possono arrivare dei 
suggerimenti...
In particolare, mi fa pensare il nome della tua classe...
Prova a rispondermi/ti a queste domande. (Se vuoi, naturalemente)
Una pagina web _č_un_ HashSet?
O _contiene/usa_ un HashSet?
-- 
Ciao
	Fabrizio C.

O _contiene/usa_ un HashSet?
In effetti non ho detto molto su quello che avevo intenzione di fare
perchè intendevo porre il problema specifico del metodo equals, ma la
discussione si fa interessante e penso molto istruttiva (chiaramente
non solo per me).
Ora la dico tutta: la mia intenzione è quella di realizzare una classe
che rappresenti i link contenuti in una pagina web. Per questo scopo è
sufficiente per me avere il nome della pagina web e l'elenco dei link
privo di duplicazioni.
Un hash set contenente pagine web è facilmente utilizzabile per
rappresentare un grafo dove i nodi sono le pagine web e gli archi sono
i link.
E qui emerge un evidente limite: lo stile nella programmazione.
Secondo me la risposta più giusta ai quesiti è : una pagina web
contiene un HashSet.
Ma basta estendere un hash set e aggiungere un campo url ed ho una
struttura dati che mi fornisce un set di metodi più che sufficente per
i miei scopi.
Ma questo non mi porta a scrivere del codice a oggetti che si rispetti
perchè non creo una classe che rappresenti completamente l'oggetto
"pagina web", ma un qualcosa che a me serve al momento.
Credo che le tue domande siano cruciali e indicano chiaramente qual'è
secondo te la via da seguire nella programmazione OO. 
Giusto ?
Per quanto riguarda quello che voglio fare è semplice: per cercare una
pagina web in un vettore volevo usare una stringa invece di un oggetto
WebPage. Es. indexOf("
http://www.paginaweb.it
") al posto di
indexOf(webpage).
Per il momento ho scritto un metodo in cui creo un oggetto WebPage,
gli assegno il nome da cercare e lo passo come argomento per la
ricerca.
Forse mi sono dilungato un po' troppo .... :-))
Un saluto e grazie .
Luigi

ricerca.
L'importante è sapere che non esiste mai un solo modo di fare le cose 
;-)
-- 
Ciao
	Fabrizio C.