Идея после первого разрешения она будет полагаться на кэширование ОС? Все еще это кажется неэффективным и в случаях нескольких доменов, решающих к тому же IP, неправильному. Что я пропускаю?
Многие люди считают, что это была очень плохая идея.
Вот некоторое объяснение из Javadoc URI. Этот вопрос также полезен.
Почему хэш-код java.net.URL преобразовывает хост в IP-адрес?
Есть две причины. Первый:
URL
было разработано для моделирования URL, являющегося указателем доступного в сети ресурса. В частности, равно
и hashCode ()
были разработаны таким образом, чтобы два экземпляра URL
были равны, если они находят один и тот же ресурс. Для этого требуется, чтобы имя DNS было преобразовано в IP-адрес. Оглядываясь назад, мы знаем следующее:
Метод URL.equals
не может 1 надежно определить, являются ли две строки URL-адресов локаторами для одного и того же ресурса. . Причины включают виртуальный хостинг, пересылку HTTP 30x, внутреннее сопоставление URL-адресов на сервере и т. Д.
Поведение при разрешении IP-адресов URL.equals
и URL.hashcode
является ловушкой для неопытных Java-программистов, хотя оно четко задокументировано.
Даже в тех случаях, когда это приводит к правильному ответу, разрешение IP по URL.equals
может привести к неожиданному (и нежелательному) снижению производительности.
Короче ... этот аспект дизайна для URL
был ошибкой.
Это подводит нас ко второй, более важной причине.
URL.equals (Object)
было определено давным-давно, и его было бы невозможно изменить сейчас, не нарушив (возможно) миллионы развернутых приложений Java.Это исключает любую возможность того, что Sun (теперь Oracle) изменит его. Возможно, разработчики (гипотетического) преемника библиотеки классов Java могли бы исправить это (и другие вещи). Конечно, обратная совместимость с существующими программами Java должна быть исключена из окна , чтобы достичь этого.
И, наконец, настоящий ответ для разработчиков приложений Java - просто использовать вместо этого класс URI. (Настоящая разработка программного обеспечения - это выполнение работы настолько хорошо, насколько это возможно, а не жалобы на инструменты, которые вам предоставили.)
1 - Когда я говорю «не могу» выше, я имею в виду, что это теоретически невозможно. Решение некоторых из наиболее сложных случаев потребует изменений в протоколе HTTP. И даже если гипотетический HTTP 2.0 «решит» проблему, мы все равно будем иметь дело с устаревшими серверами HTTP 1.1 через 20 лет ... и, следовательно, URL.equals
все равно будет неработоспособным.
Не используйте java.net.URL
. Это простой ответ на ваш вопрос. Вместо этого используйте java.net.URI
, который не будет выполнять разрешение имени хоста.
hashCode ()
тесно связан с equals ()
. Объяснение этого поведения описано в документации для equals ()
следующим образом:
Два хоста считаются эквивалентными, если оба имени хоста могут быть преобразованы в одинаковые IP-адреса; иначе, если какое-либо имя хоста не может быть разрешено, имена хоста должны быть одинаковыми без учета регистра ; или оба имени хоста равны null.
Источник: java.net.URL.equals () docs.