Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
public static class FuckMeGentlyWithAChainsaw {
/* This wrapper class exists to work around the possibly most
* stupid Java bug ever (and that's saying a lot): That
* URL.equals and URL.hashCode do DNS lookups and
* block. Which, of course, not only sucks performance-wise
* but also breaks actual correct URL equality. */
public final URL url;
public FuckMeGentlyWithAChainsaw(URL url) {
this.url = url;
}
}
Код из клиента одной онлайн игрушки, процитирован дословно.
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.
я вот что то не понял, какой вообще смысл сравнивать url по айпишникам, на которые они резолвятся? не сходится ни с виртуальным хостингом, ни с зеркалированием
И не было ещё понимания, что URL - это синтаксическая конструкция, и что сравнивать её нужно синтаксически. Сановцы, поди, думали (писалось-то это в суровые девяностые и предназначалось в основном для загрузки всяких картинок в апплеты): вот мы какие опупеть крутые, сравниваем URL семантически!
И не было понимания того, что в equals и hashCode нельзя выполнять дорогие операции.
Очень глупо они реализовали этот equals. Если имя резольвится в несколько ойпи, то http://google.ru с некоторой вероятностью не равно http://google.ru, я молчу про виртуалхосты 😉
Кстати в документации ниже об этом сказано: Note: The defined behavior for equals is known to be inconsistent with virtual hosting in HTTP.
- Так вот, мы предлагаем тебе самый разумный выход из ситуации. Ты остаёшься у нас, у меня есть связи в Москве, мы выясняем всё про твою квартиру, а потом видно будет.
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.
И не было ещё понимания, что URL - это синтаксическая конструкция, и что сравнивать её нужно синтаксически. Сановцы, поди, думали (писалось-то это в суровые девяностые и предназначалось в основном для загрузки всяких картинок в апплеты): вот мы какие опупеть крутые, сравниваем URL семантически!
И не было понимания того, что в equals и hashCode нельзя выполнять дорогие операции.
Кстати в документации ниже об этом сказано:
Note: The defined behavior for equals is known to be inconsistent with virtual hosting in HTTP.