Zmienne wyniki porównań java.net.URL
Zgadnij co wypisze na konsolę taki fragment kodu:
public static void main(String a[]) throws MalformedURLException { java.net.URL url1 = new java.net.URL("http://o2.pl"); java.net.URL url2 = new java.net.URL("http://tlen.pl"); System.out.println(url1.equals(url2)); }
Zabawne, ale nie będzie to za każdym razem to samo co łamie założenia metody equals.Zarówno wartość hashCode jak i porównania dla java.net.Url zależy od tego na jakie adresy wskazują nazwy hostów. Jeśli nie da się rozwiązać nazw (jesteśmy odłączeni od sieci a nazw nie ma w lokalnym pliku z hostami) to obiekty będą różne a hashCode() będzie zwracać różne wartości.
W kodzie JRE z IBM podczas porównywania możemy natknąć się na taki fragment:
InetAddress a1 = getHostAddress(u1); InetAddress a2 = getHostAddress(u2); // if we have internet address for both, compare them if (a1 != null && a2 != null) { return a1.equals(a2);
Komentarz wszystko tłumaczy :) Przy obliczaniu hashCode() natomiast:
// Generate the host part. InetAddress addr = getHostAddress(u); if (addr != null) { h += addr.hashCode(); }
Powyższy przykład pokazuje, że nie możemy wierzyć, że wszystkie klasy biblioteczne Javy spełniają ogólne założenia. Jeśli przeszkadza zachowanie java.net.URL można użyć java.net.URI reprezentującej identyfikator jako taki konstruowanej na podstawie analizy ciągu znaków. W tym przypadku należy jednak pamiętać, że obiekty URI stworzone z http://tlen.pl i http://www.tlen.pl będą zwracały co innego z hashCode() a ich porównanie będzie zwracało false.
Komentarze
2 komentarzy do “Zmienne wyniki porównań java.net.URL”
Chcesz coś napisać?
JavaPuzzlers ma przykład z tym :) - chyba na Parleys na filmiku
Fajne stwierdzenie tam było - że ten kod działa w zależności od połączenia do sieci - HEJ to można w ten sposób sprawdzać to czy się ma dostęp do internetu XD
Zwróć uwagę, że rozwiązywanie hostów nie opiera się wyłącznie na DNS, ale także na przykład na plikach hosts.