Как стать автором
Обновить

Комментарии 27

Даёшь больше постов про Groovy! Обожаю этот язык, неимоверная гибкость плюс совместимость со всеми java библиотеками. Многие его сильно недооценивают.
Не вопрос :)
Если бы ты привёл РЕАЛЬНЫЙ пример из которого было ясно, зачем это нужно — цены бы тебе не было.

А вообще — я за груви, да…
Знаешь что? Вот тебе код, который восполняет самый большой пробел в JDK:

Integer.metaClass.static.answer = {-> 42}
assert Integer.answer() == 42

Ну, а если серьезно, в основном для всяких DSL-ов, чтобы код читался как текст.
Сам Groovy много чего делает подобным образом. Например, как вдруг у JDK-евских collections появились методы each, find и т.д., а у того-же Integer-а тот самый метод plus()? Примерно таким-же образом.
Благая цель, груви рулез, твой пример в самом посте — хреновый.
(Груви и тебя лично — уважаю, ты не подумай ...)
Я знаю, что пример провокативный, поэтом облепил его disclaimer-ами со всех сторон, включая цитату Гийома.
Пример не провокативный. Пример — говно.
Пример может и не очень, зато второй вывод какой замечательный. Хотя наверное каждому до него стоит дойти своим умом, иначе все равно на подкорку не запишется.
Эй, «хреновый» был лучше!
Главное преимущество этого примера в том, что он простой и понятный.
Мне не нужно объяснять, что я пытаюсь сделать, и могу сосредоточиться на том, как. Ради чего все это и затевалось.
Сорри. «Не очень удачный» :)
Java тем и хороша, что статична — легко искать зависимости.
Как только же появляется возможность добавления mixin'ов — вся статика идет лесом, и получаем debug hell (для сложных запутанных случаев, есс-но).
Вы совершенно правы, Java очень хороша для большинства общих задач. Но вот в meta-programming-е она, увы и ах не сильна, by design. Это как шурупы молотком — можно, конечно, но есть инструменты получше. О чем, собственно, и топик :)
НЛО прилетело и опубликовало эту надпись здесь
Это к чему?
Ха, действительно :)
Все равно через одно место.
Смешанные чувства вызывает пост. С одной стороны — вроде ни о чем вообще, 2 факта «int при боксинге в джаве кешируется» и «в груви можно переопределить оператор +» размазаны по 2 килобайтам текста. С другой стороны — вроде бы и пазл прикольный, и параллельно несколько смежных фактов про груви узнал, и к выводам не придраться…
Да, некоторым графоманством страдаю, признаю. Стараюсь, чтобы хоть читать было не тяжело :-)
Такой же трюк делается со строками если рассчитывать что все строки, объявленные в коде, кладутся в перм ген: gist.github.com/1063013

А еще есть класс Unsafe, предназначенный явно не для безопасных вещей, но про него тут уже, по-моему, писали.
Название класса Unsafe как ничто другое подчеркивает мой аргумент. То, что в Java «ни за что на свете» (и совершенно, кстати, правильно), в Groovy — be my guest.
Весело же. Хотя явно разрушительные вещи вроде переопределения плюса можно порезать проверками в компиляторе. А вообще практическое применение такое переопределение методов имеет или оно сделано только для лулзов?
вот прям заменять, это, конечно редкость, потому что пользователи привыкли, что метод делает что-то одно, а тут бац! — и другое, а вот добавлять — весьма. Завтра напишу топик с примером.
спасибо, почитаю
Да и вообще, нам просто повезло, что у Integer-а есть этот кэш, который можно подкрутить. Иначе — никак нам этот финт с изменением плюса не провернуть.
Плюс в Java-коде всё же не менялся, менялось значение в кэше.

Не будь этого кэша, мы по-прежнему могли бы выстрелить себе в ногу, поместив следующий код в предке нашего класса Test:

	static {
		ClassLoader classLoader = Test.class.getClassLoader();
		classLoader.setClassAssertionStatus("Test", false);
	}

Плюс в Java-коде всё же не менялся, менялось значение в кэше.

Ну, технически да, но для того, кто видит логику в main все выглядит так, как будто изменился плюс.
Не будь этого кэша, мы по-прежнему могли бы выстрелить себе в ногу, поместив следующий код в предке нашего класса Test:

Му-ха-ха, это сурово, ага :) Но как-то уж совсем хитрожопо :)
В Scala тоже можно переопределять операторы, и что?
Я даже на знаю, как ответить на вопрос «и что?» И ничего. К тем же двум выводам можно было придти приведя пример на Скале, да. Если вас интересует, почему я использовал Groovy, то ответ прост — из-за схожости синтаксиса разница в подходе разительна и наглядна. «Использовать правильные инструменты», я уже говорил?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории