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.

Zacheusz

Komentarze

2 komentarzy do “Zmienne wyniki porównań java.net.URL”

  1. Paweł on March 12th, 2009 3:07 pm

    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

  2. Zacheusz Siedlecki on March 12th, 2009 3:25 pm

    Zwróć uwagę, że rozwiązywanie hostów nie opiera się wyłącznie na DNS, ale także na przykład na plikach hosts.

Chcesz coś napisać?





*