- 1
- 2
- 3
- 4
- 5
- 6
try{
name.toLowerCase();
}catch (NullPointerException e) {
report().error("java.lang.NullPointerException", e);
name = "";
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+83
try{
name.toLowerCase();
}catch (NullPointerException e) {
report().error("java.lang.NullPointerException", e);
name = "";
}
Перспективная проверка на null
wissenstein 13.12.2012 23:26 # +3
%)
Elvenfighter 13.12.2012 23:34 # +6
Ну некрасиво смотрится ведь!
wissenstein 14.12.2012 00:38 # −2
ни к чему не приводит, ведь значение name останется таким же, как и до вызова toLowerCase.
bormand 14.12.2012 05:32 # +8
... подумал программист и, не долго думая, удалил строку 2.
wissenstein 15.12.2012 03:36 # 0
А от записывания (и тем более от бросания) NullPointerException тут вообще надо бы отказаться. Мы ведь уже предусмотрели, что делать в случае (name == null).
bormand 15.12.2012 09:47 # +2
roman-kashitsyn 15.12.2012 10:09 # +4
wissenstein 15.12.2012 11:10 # 0
%)
В этом случае, за исключением репорта, тут полностью сохраняется семантика фрагмента.
bormand 15.12.2012 10:01 # +5
Кажется я понял мотив того, кто писал данный код.
У автора кода возникла проблема - код крашился в непонятном месте с NPE, но логирования еще не было. Клиенты уже злые, и доводить дело до крешлога в следующий раз нельзя...
Поэтому автор принял такое решение - перед каждым подозрительным местом он вставляет приведенную ОП'ом заглушку, которая сохранит бектрейс в лог (именно для этого вброшено исключение), а значение заменяет на пустую строку, чтобы программа могла продолжить работу.
Затем, через некоторое время, он прочтет лог, поймет где же возникает NPE, и выпилит эти заглушки.
[/SherlockHolmes]
Govnocoder#0xFF 19.12.2012 00:17 # +2
eth0 14.12.2012 19:59 # 0
absolut 14.12.2012 20:58 # +4
3.14159265 14.12.2012 21:08 # +2
Настоящие жависты toString() безопасный от NPE, делают так: ""+obj.
bormand 14.12.2012 21:09 # +2
Тут как раз в соседнем треде обсуждали, что в Objective C на null'ах можно вызывать что угодно, и оно промолчит и не крашнется.
3.14159265 14.12.2012 21:11 # 0
Зачем NPE? Идиотия.
Кстати мне нравится в C# extension methods, то что они так и сделаны.
bormand 14.12.2012 21:24 # +1
Ну как зачем. При вызове через null жаба тупо не знает, метод какого класса ей вызывать. Здесь я вижу только три варианта:
1) Ничего не вызывать, и вернуть 0.0, 0, null или false, в зависимости от типа результата.
2) Вызывать метод согласно типу переменной (в данном случае Object), подсунув ему null в this.
3) Сделать нуллы типизированными (null перестанет быть пустой ссылкой, а будет ссылкой на null-объект соотвествующего класса) - запретить использовать просто null, а писать что-то в духе Foo.null или Bar.null.
И все они мне нравятся еще меньше чем экцепшн, или необходимость ручной проверки на null...
3.14159265 14.12.2012 21:32 # 0
>И все они мне нравятся еще меньше чем экцепшн, или необходимость ручной проверки на null...
Тоже щитаю, что NPE - меньшее из зол.
Могли хотя бы обращения к полям null ового объекта выдавать как null.
Хотя с повальными getter/setter и отсутсвием сахара в виде свойств это никого бы не спасло.
Короче NPE-говно в крестах, жабе и решетке у самого основания.
bormand 14.12.2012 21:42 # +3
Необходимое зло ;(
> Ради полиморфизма - убогой пародии на мультиметоды.
Да кстати, полноценный мультиметод не смог бы быть членом класса (и даже статиком), поэтому они бы разнесли уютненький мир жабы и шарпика к хуям.
absolut 14.12.2012 21:48 # 0
LispGovno 14.12.2012 22:49 # 0
Лолчто? Существуют не симетричные мультиметоды. Они они даже по сильнее симетричных:
bormand 14.12.2012 23:24 # 0
2) Ну висит он себе в статике. Как я его вызывать то буду? Допустим есть такой код: Если эта конструкция не работает - то как мне вызвать этот "мультиметод"? Через Foo.multi() ? Ну и нахуй он тогда сдался? А если работает - то метод уже нихуя не член класса, т.к. вывалился из положенной ему области видимости...
LispGovno 14.12.2012 23:26 # 0
Лолшто?
AHAH А у тебя стасик не подсвечивает
LispGovno 14.12.2012 23:33 # +1
bormand 14.12.2012 23:44 # +1
LispGovno 15.12.2012 00:31 # 0
LispGovno 15.12.2012 12:13 # 0
roman-kashitsyn 15.12.2012 12:21 # +5
guest 15.12.2012 12:26 # +3
ps:Чё это меня разлогинило?
guest 15.12.2012 12:27 # +2
roman-kashitsyn 17.12.2012 17:00 # 0
LispGovno 17.12.2012 17:29 # 0
LispGovno 17.12.2012 17:30 # 0
absolut 15.12.2012 12:56 # +1
LispGovno 17.12.2012 17:50 # 0
LispGovno 15.12.2012 12:56 # +1
PPPS: Знаю что вас много. Но меня как истинного борща за свободу это не волнует.
3.14159265 17.12.2012 17:03 # 0
Они там есть.
А еще чудесное слово dynamic. Определяет какой метод вызввать в рантайме.
Проблема в том что если оно не может разрулить какой метод вызвать - есть альтернативы, или вообще без вариантов, то оно в том же рантайме и падает.
roman-kashitsyn 17.12.2012 17:06 # 0
Это не мультиметоды, это утиная типизация.
3.14159265 17.12.2012 17:13 # 0
Ну с этой фичей можно забыть о полиморфизме.
LispGovno 14.12.2012 22:33 # −2
bormand 14.12.2012 22:35 # +2
LispGovno 14.12.2012 22:41 # 0
4)Метод вернет Maybe.Nothing вместо результата.
5)Объект Null примет сообщение toString и решит как его обработать. Может исключение, а может ещё что-то. Хотя потомок все объектов Object.Null мне больше нравится. Так можно больше вариантов для обработки и изменения поведения сделать.
absolut 14.12.2012 21:27 # +2
bormand 14.12.2012 21:31 # 0
Вызов же обычного метода будет разруливаться в рантайме - ведь вместо объекта могут подсунуть его потомка. И вот там null уже довольно фатален, т.к. рантайм не знает, что ему вызвать.
3.14159265 14.12.2012 21:37 # 0
Только статика, только хардкор!
А полиморфизм мы заменим ссылками на функцию, делегатами или фп!
absolut 14.12.2012 21:42 # +3
3.14159265 14.12.2012 22:20 # +1
И с тарасоформатированием, обязательно!!!
Хотя "тарасоформатирование" и устоявшийся тут термин, но эксклюзивных прав Тарасу форматировать так код никто не давал, поскольку я, например задолго до всех обсуждений на гк юзаю подобный подход.
defecate-plusplus 14.12.2012 22:34 # +5
bormand 14.12.2012 22:04 # +2
Попробуем применить эту идею к яве. Разобъем типы на 2 категории - допускающие нулл (обозначим как nullable в шарпике через Object?) и недопускающие (обозначим Object). Object можно невозбранно кастовать в Object?, но не наоборот. При вызове метода на Object? метод автоматически лифтится, и если он возвращал T, то полученный метод будет возвращать T?.
Пример: Вот такая вот концепция пришла в мою сонную голову. При такой схеме NPE невозможно. Любая возможность его появления жестко пресекается компилятором. При Nothing на входе будет возвращать Nothing на выходе, при Just x на входе вернет Just (a x).
bormand 14.12.2012 22:11 # +1
LispGovno 14.12.2012 22:54 # +1
Yuuri 19.12.2012 16:54 # +1
LispGovno 19.12.2012 22:24 # 0
LispGovno 14.12.2012 23:08 # +3
Псевдокод:
Таким вот нехитрым образом через икстеншен методы добавлять можно недомонады. toString вызовется только если 'a' не null, а затем если 'a' не нуоль и результат toString не null вызывается print.
3.14159265 14.12.2012 23:13 # +3
Проблема "умного" подхода ровно в одном: кода получается больше, читается он хуже и работает чуть медленей, чем "тупые" ifы.
ЗЫ. А. Теперь вижу хорошую, олдскульную картинку. Плюс.
Где-то у меня была сцылка на редкость упоротого поциента, который монадил в шарпе.
LispGovno 14.12.2012 23:17 # 0
absolut 14.12.2012 21:46 # +1
виртуального
bormand 14.12.2012 22:05 # 0
LispGovno 14.12.2012 22:27 # +2
лолчто?
this.method(params) по сути сахар над
bormand 14.12.2012 22:29 # +1
LispGovno 14.12.2012 22:32 # 0
bormand 14.12.2012 22:43 # +3
А в яве вообще нет.
P.S. Ну собственно ява сама по себе совсем простой язык. На порядки проще решеток и крестов, где-то в районе питона. Все сложности начинаются в ее стандартной либе...
3.14159265 14.12.2012 22:47 # +1
Я бы упомянул про final - раз. Про static - два. Ну ладно - нет, так нет.
>Ну собственно ява сама по себе совсем простой язык.
Да, одна из немногих положительных её сторон, что они вдохновлялись минимализмом Вирта.
>Все сложности начинаются в ее стандартной либе...
Не будем о плохом...
LispGovno 14.12.2012 23:13 # +1
3.14159265 14.12.2012 23:18 # +3
final на переменных тоже вроде как ограничение для компилятора, а внутри HotSpota - это флаг который влияет на то когда можно публиковать объект.
bormand 14.12.2012 23:39 # +1
static - ну статики да, не виртуальные, само собой, но у них и this нет, поэтому хрен с ними.
3.14159265 17.12.2012 16:24 # +1
Ибо метод не из интерфейса, а сам класс String - финальный.
Более того даже если у тебя самый обычный нефинальный класс без родителей и наследников, то вм может догадаться и заинлайнить его методы.
В HotSpote они даже оптимизируют полиморфизм для джвух наследников, а такие простые случаи и подавно.
То есть теоретически bormand - прав, по дефолту всё виртуальное, но внутри jvm оно может быть как просто вызовом, так и вообще инлайнится в код.
Возможно поэтому Блох в книжке рекомендует писать побольше finalов и запрещать наследование, там где не предполагается расширять в дальнейшем.
LispGovno 17.12.2012 17:44 # 0
Как-то так?
3.14159265 17.12.2012 17:55 # 0
http://www.javaspecialists.eu/archive/Issue158.html
We run this six times, one for each test case. Here are the test cases:
When you run it with Java 6 -server, A1 and A2 come back with an average of 0 (0). The standard deviation is in brackets. In the case of a simple pointer to B or where there is a single subclass of B, the method call is inlined.
A3 is the bi-morphic case, where we have two subclasses of B. In this case, the results come back as 495 (9).
3.14159265 17.12.2012 17:56 # +1
according to Cliff Click, deals with bi-morphism as a special case of poly-morphism: "Where the server compiler can prove only two classes reach a call site, it will insert a type-check and then statically call both targets (which may then further inline, etc)."
"HotSpot uses an inline-cache for calls where the compiler cannot prove only a single target can be called. An inline-cache turns a virtual (or interface) call into a static call plus a few cycles of work. It's is a 1-entry cache inlined in the code; the Key is the expected class of the 'this' pointer, the Value is the static target method matching the Key, directly encoded as a call instruction. As soon as you need 2+ targets for the same call site, you revert to the much more expensive dynamic lookup (load/load/load/jump-register). Both compilers use the same runtime infrastructure, but the server compiler is more aggressive about proving a single target."
3.14159265 17.12.2012 22:17 # +2
>TCockB
Лол, только сейчас обратил внимание на нейминг.
Тип того. Он не лезет в таблицу, а прописывает адреса для calla явно.
Как видим, ускорение, от меньшего кол-ва обращений к памяти, около 5-6 раз.
3.14159265 17.12.2012 16:26 # 0
Ява раньше была очень тормозной, а из-за реализации таких вот вещей она стала просто тормозной.
И всё-таки быстрее, чем тот же js, хацкиль или питон. А если на каждый чих лезть в таблицу виртуальных методов это катастрофически понизит скорость.
roman-kashitsyn 17.12.2012 16:48 # 0
Вот насчёт хацкила, кстати, неуверен.
Он хоть худо-бедно, но изначально компилился в натив. А в жабе 1.1 только интерпретация байт-кода, только хардкор. Да и потребление памяти у него всегда было значительно меньше (при рациональном коде, разумеется)
3.14159265 17.12.2012 16:51 # 0
Всё что выигрывается на assParallel, то и тратится на иммутабельность.
Но зато простор для оптимизации и роста - огромный.
roman-kashitsyn 17.12.2012 16:56 # 0
3.14159265 17.12.2012 17:14 # +1
А еще scala иногда быстрее чем "оптимальный" код на жабе.
Плюс scala быстрее и короче хацкиля.
Знаю я как бенчи делают. Очень трудно сделать объективно.
bormand 17.12.2012 17:20 # +1
Идеальный бенч должен делать человек, которому похуй на обе системы. Но т.к. ему похуй, он его делать не будет. Поэтому честных бенчей нет :(
3.14159265 17.12.2012 17:24 # +1
А то скала получается быстрее чем жаба в которую она транслируется.
Это как сишка получилась бы быстрей ассемблера.
bormand 17.12.2012 17:31 # +1
В общем то если взять матёрого сишника, и нуба-ассемблерщика, то так оно и будет. Что-то мне подсказывает, что и со скалой был точно такой же бенч.
LispGovno 17.12.2012 17:47 # 0
bormand 17.12.2012 18:03 # +2
Проблема в том, что задание для бенчмарка должен составлять нейтральный человек. Иначе он придумает такую задачу, которая легче реализуется на том языке, который ему больше нравится...
LispGovno 17.12.2012 18:04 # 0
Ещё вариант - попросить какого-нибудь математика задачу составить, который кроме матпакета ничего и не видел.
3.14159265 17.12.2012 18:30 # +3
Нужны задачи приближенные к практике. С этим никто спорить не будет?
3.14159265 17.12.2012 18:30 # +2
а не что-то а-ля projecteuler.
Но это область нативной сишки и асмовставками.
LispGovno 17.12.2012 19:31 # 0
Хаскель не может в асмовставки
3.14159265 17.12.2012 19:34 # 0
LispGovno 17.12.2012 20:10 # 0
3.14159265 17.12.2012 22:57 # +3
3.14159265 17.12.2012 22:56 # +3
Ну на том сайте вроде так и делают.
А хацкиль делает жабу в среднем зачете, только потому что джва последних теста: Bad Output и No program.
Так вот жаба сливает скале и хацки в бенче с интересным неймом pinumbers.
Ну во-первых в глаза бросилось читерство:
http://shootout.alioth.debian.org/u32/program.php?test=pidigits&lang=java&id=2
И шо это за гумно? Наверное вывод в буферизованный поток еще не проходили.
Скала кстати тоже так написана.
Наверное сравнивают скорость буферизации при выводе и либы, а не языки.
guest 14.12.2012 00:14 # +2
santa_microbe 14.12.2012 09:19 # +1
а зачем вот эта строчка ?
Я бы ее тоже грохнул, особого смысла в ней не вижу
wissenstein 15.12.2012 15:08 # +1
Более того, я в ней вижу зло, потому что, во-первых, занимает ресурсы на генерацию исключения, а во-вторых, засоряет лог, ведь полезной информации не даёт.
max_wp 25.08.2021 06:26 # 0