Pull to refresh

Comments 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. Это как шурупы молотком — можно, конечно, но есть инструменты получше. О чем, собственно, и топик :)
UFO landed and left these words here
Ха, действительно :)
Все равно через одно место.
Смешанные чувства вызывает пост. С одной стороны — вроде ни о чем вообще, 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, то ответ прост — из-за схожости синтаксиса разница в подходе разительна и наглядна. «Использовать правильные инструменты», я уже говорил?
Sign up to leave a comment.

Articles