So wie ich das verstehe sollte dann die URL ebenfalls nicht mehr als gleich angesehen werden, da in equals ebenfalls Nameresolution betrieben wird.
Das ist aber nicht Part der URL! Aber das ist halt etwas, das die Entwickler so sehen wie Du (Unabhängig davon, ob ich dem folgen kann oder nicht).
declaration: module: java.base, package: java.net, class: URL
docs.oracle.com
Class URL represents a Uniform Resource Locator, a pointer to a "resource" on the World Wide Web.
Und da wird dann dieser Pointer auch beschrieben incl. dem Host. Und das ist da dann einfach ein Part des Strings.
Equals schreibst dann zwar auch:
Two hosts are considered equivalent if both host names can be resolved into the same IP addresses; else if either host name can't be resolved, the host names must be equal without regard to case; or both host names equal to null.
Since hosts comparison requires name resolution, this operation is a blocking operation.
Note: The defined behavior for equals is known to be inconsistent with virtual hosting in HTTP.
Aber dem kann ich nicht folgen! Die IP Adresse ist aus meiner Sicht eine andere Abstraktionsebene, die bei dem Vergleich nicht wirklich sinnvoll ist.
(Und die IP ist einfach uninteressant! Diese Abstraktionsebene ist ja eben eingeführt wurden, um hier eine Unabhängigkeit zu schaffen! Zu Cloud Zeiten noch viel mehr als früher! Es gibt dynamische Prozesse die ggf. mehr oder weniger Ressourcen zuordnen. Das mag alles gehen, so alles hinter LoadBalancern steckt oder hinter einer "virtuellen" IP, aber dem muss ja nicht so sein! Reicht ja schon, dass ich auf einer kleinen Hand voll Servern Dinge verschiebe von einem Server zu einem anderen. Du bist abhängig von Dingen außerhalb - das ist zumindest nicht mein Verständnis vom equals.
Mein Hauptkritikpunkt ist hier:
a) Es ist einfach überkompliziert. und in meinen Augen nicht intuitiv. (Oder ist das ein erwartetes Verhalten?)
b) Probleme bei der Nutzung: HashCode / equals abhängig von der IP, die außerhalb des Systems liegt. Du speicherst also eine URL als Key in einer HashMap und wirst diese dann nicht mehr aufrufen können, so sich bei der IP etwas geändert haben sollte. (hashCode wird wohl gecached - aber das löst nicht wirklich die Probleme!)
c) Mögliche Probleme bei der Implementation, die dann in Spezialfällen zu Verstößen gegen den Contract führen (Je nach Caching kann man sowas entwerfen. Aber ich revidiere mein Urteil etwas, denn das ist dann kein Verstoß gegen den Kontrakt der durch den Ansatz kommt sondern eben durch einen "Fehler" in der Implementation kommt.)
Also ich bin hier ehrlich gesagt extrem überrascht und kann die Beweggründe hier gerade nicht nachvollziehen.
Ich hatte auch einmal im .Net Bereich geschaut und da ist sowas nicht der Fall. Da läuft es aber auch über die Klasse Uri.