Комментарии 27
Даёшь больше постов про Groovy! Обожаю этот язык, неимоверная гибкость плюс совместимость со всеми java библиотеками. Многие его сильно недооценивают.
+6
Если бы ты привёл РЕАЛЬНЫЙ пример из которого было ясно, зачем это нужно — цены бы тебе не было.
А вообще — я за груви, да…
А вообще — я за груви, да…
0
Знаешь что? Вот тебе код, который восполняет самый большой пробел в JDK:
Integer.metaClass.static.answer = {-> 42}
assert Integer.answer() == 42
Ну, а если серьезно, в основном для всяких DSL-ов, чтобы код читался как текст.
Сам Groovy много чего делает подобным образом. Например, как вдруг у JDK-евских collections появились методы each, find и т.д., а у того-же Integer-а тот самый метод plus()? Примерно таким-же образом.
Integer.metaClass.static.answer = {-> 42}
assert Integer.answer() == 42
Ну, а если серьезно, в основном для всяких DSL-ов, чтобы код читался как текст.
Сам Groovy много чего делает подобным образом. Например, как вдруг у JDK-евских collections появились методы each, find и т.д., а у того-же Integer-а тот самый метод plus()? Примерно таким-же образом.
+2
Благая цель, груви рулез, твой пример в самом посте — хреновый.
(Груви и тебя лично — уважаю, ты не подумай ...)
(Груви и тебя лично — уважаю, ты не подумай ...)
0
Я знаю, что пример провокативный, поэтом облепил его disclaimer-ами со всех сторон, включая цитату Гийома.
+2
Пример не провокативный. Пример — говно.
-6
Пример может и не очень, зато второй вывод какой замечательный. Хотя наверное каждому до него стоит дойти своим умом, иначе все равно на подкорку не запишется.
0
Эй, «хреновый» был лучше!
Главное преимущество этого примера в том, что он простой и понятный.
Мне не нужно объяснять, что я пытаюсь сделать, и могу сосредоточиться на том, как. Ради чего все это и затевалось.
Главное преимущество этого примера в том, что он простой и понятный.
Мне не нужно объяснять, что я пытаюсь сделать, и могу сосредоточиться на том, как. Ради чего все это и затевалось.
+1
Java тем и хороша, что статична — легко искать зависимости.
Как только же появляется возможность добавления mixin'ов — вся статика идет лесом, и получаем debug hell (для сложных запутанных случаев, есс-но).
Как только же появляется возможность добавления mixin'ов — вся статика идет лесом, и получаем debug hell (для сложных запутанных случаев, есс-но).
0
НЛО прилетело и опубликовало эту надпись здесь
Смешанные чувства вызывает пост. С одной стороны — вроде ни о чем вообще, 2 факта «int при боксинге в джаве кешируется» и «в груви можно переопределить оператор +» размазаны по 2 килобайтам текста. С другой стороны — вроде бы и пазл прикольный, и параллельно несколько смежных фактов про груви узнал, и к выводам не придраться…
0
Такой же трюк делается со строками если рассчитывать что все строки, объявленные в коде, кладутся в перм ген: gist.github.com/1063013
А еще есть класс Unsafe, предназначенный явно не для безопасных вещей, но про него тут уже, по-моему, писали.
А еще есть класс Unsafe, предназначенный явно не для безопасных вещей, но про него тут уже, по-моему, писали.
+1
Название класса Unsafe как ничто другое подчеркивает мой аргумент. То, что в Java «ни за что на свете» (и совершенно, кстати, правильно), в Groovy — be my guest.
0
Весело же. Хотя явно разрушительные вещи вроде переопределения плюса можно порезать проверками в компиляторе. А вообще практическое применение такое переопределение методов имеет или оно сделано только для лулзов?
+1
Да и вообще, нам просто повезло, что у Integer-а есть этот кэш, который можно подкрутить. Иначе — никак нам этот финт с изменением плюса не провернуть.Плюс в Java-коде всё же не менялся, менялось значение в кэше.
Не будь этого кэша, мы по-прежнему могли бы выстрелить себе в ногу, поместив следующий код в предке нашего класса Test:
static {
ClassLoader classLoader = Test.class.getClassLoader();
classLoader.setClassAssertionStatus("Test", false);
}
+1
Плюс в Java-коде всё же не менялся, менялось значение в кэше.
Ну, технически да, но для того, кто видит логику в main все выглядит так, как будто изменился плюс.
Не будь этого кэша, мы по-прежнему могли бы выстрелить себе в ногу, поместив следующий код в предке нашего класса Test:
Му-ха-ха, это сурово, ага :) Но как-то уж совсем хитрожопо :)
0
В Scala тоже можно переопределять операторы, и что?
0
Я даже на знаю, как ответить на вопрос «и что?» И ничего. К тем же двум выводам можно было придти приведя пример на Скале, да. Если вас интересует, почему я использовал Groovy, то ответ прост — из-за схожости синтаксиса разница в подходе разительна и наглядна. «Использовать правильные инструменты», я уже говорил?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Про Правильные Инструменты