- 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.
А вот к чему это приводит.
guest 13.11.2012 15:11 # +2
defecate-plusplus 13.11.2012 15:13 # +1
roman-kashitsyn 13.11.2012 15:24 # 0
по-правильному должен всегда возвращать -1? :)
bormand 13.11.2012 15:27 # +2
3.14159265 13.11.2012 15:29 # 0
bormand 13.11.2012 15:32 # 0
http://ideone.com/7Updlh
3.14159265 13.11.2012 15:33 # 0
o.println(nan==nan);
o.println(nan==nan1);
o.println(nan==Float.NaN);
bormand 13.11.2012 15:37 # 0
http://ideone.com/23s0qg
roman-kashitsyn 13.11.2012 15:49 # +1
UPD: Поправка, Java Float не может в NaN http://ideone.com/qpPtqt
bormand 13.11.2012 15:56 # 0
http://ideone.com/RT1PxA
http://ideone.com/MjDIFH
Просто у compareTo() батхерт, т.к. число и не меньше и не больше и не равно, а вернуть то что-то надо. Хотя с другой стороны, наверное, можно было и экцепшн кинуть.
UPD: Ну вот как всегда, пока набирал и тестил примеры, Роман уже успел обновить пост и написать об этом.
TarasB 13.11.2012 15:42 # +5
roman-kashitsyn 13.11.2012 16:11 # +2
bormand 13.11.2012 16:16 # 0
3.14159265 13.11.2012 16:17 # 0
Жавой там и не пахнет.
bormand 13.11.2012 16:22 # +1
3.14159265 13.11.2012 16:24 # +3
Кстати. А ведь жаб можно лизать.
Ох прикроют говнокодик скоро, крепко прикроют.
bormand 13.11.2012 16:30 # 0
TarasB 13.11.2012 17:39 # +7
Fai 16.11.2012 18:09 # −2
3.14159265 16.11.2012 18:26 # −1
guest 16.11.2012 16:35 # 0
откуда дровишки?
3.14159265 16.11.2012 18:27 # +4
TarasB 13.11.2012 16:20 # 0
tir 13.11.2012 20:22 # 0
LispGovno 13.11.2012 21:13 # +1
Fai 14.11.2012 02:19 # +2
Не надо. Мне так хаскель сердце разибил... Но я его добьюсь.
roman-kashitsyn 13.11.2012 15:57 # +1
bormand 13.11.2012 15:58 # 0
3.14159265 13.11.2012 16:00 # 0
Давайте взглянем на это под другим углом.
На самом деле, есть трабла поглобальней - никак нельзя быстро и красиво сравнить 2 Numbera.
Если б они добавили всего-то одну строку в Number - implements Comparable<Number> и сделали в Number equals(x){return 0==compareTo(x);} - всё было б проще.
Но они этого не сделали. Почему?
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4414323
roman-kashitsyn 13.11.2012 16:05 # 0
bormand 13.11.2012 16:07 # 0
3.14159265 13.11.2012 16:16 # +1
> а вот обратное ему floatNumber.equals(myNumber)
б) есть как бы интерфейс. правда херовый, но идея понятная - привести всё к общему знаменателю.
если ты херово переопределил
public abstract double doubleValue();
это твои проблемы
Вот это очевидное поведение new Byte(2).equals(2) //false
Гораздо ужасней, чем предполагаемые "свои" имплементации.
Они такие все умные в EJ и других книжках, а в коде - говно, треш и пиздец.
bormand 13.11.2012 16:19 # +1
Для длинных целых чисел это весьма хуевый интерфейс. Вот разве что свести все к Rational'ам, и окончательно забить на скорость...
3.14159265 13.11.2012 16:21 # +2
Заодно решить известные проблемы с плавающими диапазонами.
>Для длинных целых чисел это весьма хуевый интерфейс.
Даже если б там epsilon поставили - я был бы рад.
>скорость
Java. Не смешите.
Просто им похуй.
bormand 13.11.2012 16:29 # 0
Тут еще веселее. Это вообще не скомпилится.
3.14159265 13.11.2012 16:32 # +1
Еще можно так : Byte.valueOf ( "2" ).equals(2) //false
Byte.valueOf ( "2" ).equals("2") //wtf?
bormand 13.11.2012 16:34 # 0
3.14159265 13.11.2012 16:37 # +2
Потом лезет NPE. Нуб быстро запоминает - надо ставить проверку. Или стиль использовать магистра Йоды.
Всё работает хорошо. Более никто ничего не говорит. Правило крепко усаживается в голове.
А потом начинаются исключения, где ни ==, ни equals корректо не работают или надо таки сравнивать через ==
bormand 13.11.2012 16:55 # +2
P.S. Надо бы на ведроиде попробовать сравнить два URL'а. Интересно, выдаст ли он на эту хуиту NetworkInMainThreadException или нет.
3.14159265 13.11.2012 17:12 # 0
bormand 13.11.2012 17:13 # 0
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).
wvxvw 13.11.2012 16:25 # 0
bormand 13.11.2012 16:33 # +1
wvxvw 13.11.2012 17:08 # 0
bormand 13.11.2012 17:16 # 0
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.
wvxvw 13.11.2012 17:24 # 0
bormand 13.11.2012 17:25 # 0
В жабе просто принцип: 1 класс - 1 файл. Он не нарушается даже для вложенных и анонимных классов. Поэтому подмешать какие-то методы в чужой класс без его перекомпиляции нереально.
wvxvw 13.11.2012 17:33 # +1
Честно, я не знаю, как именно организован байткод, но скорее всего есть какое-то "квалифицированное" имя, которое определяет откуда берется метод, и каким образом он относится к тому, на чем специализируется. Если скомпилировать еще один с именем сконструированым по такому же принципу - то почему бы и не заработать? Классов же как таковых нету в байткоде, это превращается просто в имена методов каким-то образом распознаваемые рантаймом как принадлежащие тому же классу. Хз. просто нет достаточно рвения попробовать подсунуть фейк со специализацией на том же объекте, что и системый класс.
bormand 13.11.2012 17:45 # 0
Lure Of Chaos 13.11.2012 23:03 # 0
я как-то баловался таким, организовывал перезагрузку классов в рантайме (каждый раз проверялось, не изменился ли класс, если да, то загружался заново)
основная трабла тут со ссылками и сборкой мусора, запросто схватить OutOfMemoryException: PermGen space
зато, внимание, основная киллерфича: один и тот же класс можно загрузить разными ClassLoader'ами (чей использовать, решает загрузчик, который загрузил класс, метод обьекта которого сейчас выполняется)
bormand 14.11.2012 05:58 # 0
В данном сферическом треде - поудалять все ссылки на Integer... не прокатит походу.
3.14159265 14.11.2012 13:27 # 0
Вот посоны решили
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
roman-kashitsyn 13.11.2012 17:16 # +2
В C# экстеншен-методы преобразуются компилятором в вызовы статических методов, скорее всего, в флеше что-то аналогичное.
Для жабы есть AOP, но это не совсем то.
wvxvw 13.11.2012 17:20 # +1