- 1
- 2
- 3
- 4
- 5
- 6
- 7
Float nan=Float.NaN;
new Float(10).compareTo(nan);
//-1
nan.compareTo(nan);
//0
new Float(Float.POSITIVE_INFINITY).compareTo(nan);
//-1. POSITIVE_INFINITY<NAN. LoL
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+93
Float nan=Float.NaN;
new Float(10).compareTo(nan);
//-1
nan.compareTo(nan);
//0
new Float(Float.POSITIVE_INFINITY).compareTo(nan);
//-1. POSITIVE_INFINITY<NAN. LoL
http://ideone.com/9WIo16
Тут некоторые товарищи в соседнем треде предлагали сравнивать объекты через compareTo()==0, если возможно.
Ну и беречься от equals как от огня, если есть Comparable.
А вот к чему это приводит.
по-правильному должен всегда возвращать -1? :)
http://ideone.com/7Updlh
o.println(nan==nan);
o.println(nan==nan1);
o.println(nan==Float.NaN);
http://ideone.com/23s0qg
UPD: Поправка, Java Float не может в NaN http://ideone.com/qpPtqt
http://ideone.com/RT1PxA
http://ideone.com/MjDIFH
Просто у compareTo() батхерт, т.к. число и не меньше и не больше и не равно, а вернуть то что-то надо. Хотя с другой стороны, наверное, можно было и экцепшн кинуть.
UPD: Ну вот как всегда, пока набирал и тестил примеры, Роман уже успел обновить пост и написать об этом.
Жавой там и не пахнет.
Кстати. А ведь жаб можно лизать.
Ох прикроют говнокодик скоро, крепко прикроют.
откуда дровишки?
Не надо. Мне так хаскель сердце разибил... Но я его добьюсь.
Давайте взглянем на это под другим углом.
На самом деле, есть трабла поглобальней - никак нельзя быстро и красиво сравнить 2 Numbera.
Если б они добавили всего-то одну строку в Number - implements Comparable<Number> и сделали в Number equals(x){return 0==compareTo(x);} - всё было б проще.
Но они этого не сделали. Почему?
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4414323
> а вот обратное ему floatNumber.equals(myNumber)
б) есть как бы интерфейс. правда херовый, но идея понятная - привести всё к общему знаменателю.
если ты херово переопределил
public abstract double doubleValue();
это твои проблемы
Вот это очевидное поведение new Byte(2).equals(2) //false
Гораздо ужасней, чем предполагаемые "свои" имплементации.
Они такие все умные в EJ и других книжках, а в коде - говно, треш и пиздец.
Для длинных целых чисел это весьма хуевый интерфейс. Вот разве что свести все к Rational'ам, и окончательно забить на скорость...
Заодно решить известные проблемы с плавающими диапазонами.
>Для длинных целых чисел это весьма хуевый интерфейс.
Даже если б там epsilon поставили - я был бы рад.
>скорость
Java. Не смешите.
Просто им похуй.
Тут еще веселее. Это вообще не скомпилится.
Еще можно так : Byte.valueOf ( "2" ).equals(2) //false
Byte.valueOf ( "2" ).equals("2") //wtf?
Потом лезет NPE. Нуб быстро запоминает - надо ставить проверку. Или стиль использовать магистра Йоды.
Всё работает хорошо. Более никто ничего не говорит. Правило крепко усаживается в голове.
А потом начинаются исключения, где ни ==, ни equals корректо не работают или надо таки сравнивать через ==
P.S. Надо бы на ведроиде попробовать сравнить два URL'а. Интересно, выдаст ли он на эту хуиту NetworkInMainThreadException или нет.
This problem is fixed in Android 4.0 (Ice Cream Sandwich). In that release, URLs are only equal if their host names are equal (ignoring case).
It's not simple. Once a class is loaded by a classloader, there is no way to change the methods of loaded classes. When a class is requested, a classloader will load it and link it. And there is no way to change the linked code or to add/remove methods.
...
We can't add or remove fields too.
В жабе просто принцип: 1 класс - 1 файл. Он не нарушается даже для вложенных и анонимных классов. Поэтому подмешать какие-то методы в чужой класс без его перекомпиляции нереально.
Честно, я не знаю, как именно организован байткод, но скорее всего есть какое-то "квалифицированное" имя, которое определяет откуда берется метод, и каким образом он относится к тому, на чем специализируется. Если скомпилировать еще один с именем сконструированым по такому же принципу - то почему бы и не заработать? Классов же как таковых нету в байткоде, это превращается просто в имена методов каким-то образом распознаваемые рантаймом как принадлежащие тому же классу. Хз. просто нет достаточно рвения попробовать подсунуть фейк со специализацией на том же объекте, что и системый класс.
я как-то баловался таким, организовывал перезагрузку классов в рантайме (каждый раз проверялось, не изменился ли класс, если да, то загружался заново)
основная трабла тут со ссылками и сборкой мусора, запросто схватить OutOfMemoryException: PermGen space
зато, внимание, основная киллерфича: один и тот же класс можно загрузить разными ClassLoader'ами (чей использовать, решает загрузчик, который загрузил класс, метод обьекта которого сейчас выполняется)
В данном сферическом треде - поудалять все ссылки на Integer... не прокатит походу.
Вот посоны решили
http://www.jarvana.com/jarvana/view/com/alibaba/citrus/tool/antx-autoexpand/1.0.10/antx-autoexpand-1.0.10-sources.jar!/org/apache/commons/beanutils/ContextClassLoaderLocal.java?format=ok
http://commons.apache.org/beanutils/apidocs/org/apache/commons/beanutils/ContextClassLoaderLocal.html
В C# экстеншен-методы преобразуются компилятором в вызовы статических методов, скорее всего, в флеше что-то аналогичное.
Для жабы есть AOP, но это не совсем то.