java что такое groovy

Groovy за 15 минут – краткий обзор

Groovy — объектно-ориентированный язык программирования разработанный для платформы Java как альтернатива языку Java с возможностями Python, Ruby и Smalltalk.

Groovy использует Java-подобный синтаксис с динамической компиляцией в JVM байт-код и напрямую работает с другим Java кодом и библиотеками. Язык может использоваться в любом Java проекте или как скриптовый язык.

Возможности Groovy (отличающие его от Java):

— Статическая и динамическая типизация
— Встроенный синтаксис для списков, ассоциативных массивов, массивов и регулярных выражений
— Замыкания
— Перегрузка операций

Более того, почти всегда java-код — это валидный groovy-код.

Установка

В IDE NetBeans 7.0 поддержка groovy идет из коробки, для IDE Eclipse существует очень хороший плагин, который можно взять здесь.

Groovy

Самое главное отличие от java: в Groovy всё является объектами. Все примитивные типы сразу же упаковываются в объекты. Т.е. «int x» на самом деле является «Integer x»

Следует не забывать о том, что все упаковочные типы — неизменяемые, поэтому каждый раз при каком-либо вычислении будет создаваться новый объект.

Строки в Groovy

1) Java Strings — строки в одинарных кавычках
2) Groovy Strings, они же GStrings — в обычных кавычках
В строках groovy можно вставлять параметры, в обычные строки — нельзя

К строкам применимы операции + и *

В groovy есть поодержка регулярных выражений на уровне конструкций языка:

Встроенная поддержка maps + lists

Так же на уровне конструкций языка поддерживаются словари (maps) и списки:

Ranges

Получать доступ к элементам списков в groovy можно следующим образом:

Range — это такой же объект, поэтому возможны конструции, подобные последней. Отрицательные индексы, как в python, возвращают элементы с конца списка.

Range можно составить из строк:

Более того, range можно сделать из любого объекта, у которого есть методы next() и prev().

Циклы

Циклы в groovy точно такие же, как и в java, плюс к ним добавляется еще один «foreach»:

Функции

Ключевое слово return указывать не обязательно — по умолчанию будет возвращено значение последней упомянутой переменной в фукции.

Closures

Closure — это анонимная функция

У многих объектов есть методы, в качестве параметров которым передаются closure:

Доступно большое количество методов для обработки последовательностей, к которым можно применять замыкания:

В closure так же не обязательно использовать ключевое слово return. Если явно не задано имя параметру, то по умолчанию используется it.

Так как closure является объектом, то ничего не мешает возвращать его из другого closure, и таким образом создавать функции высших порядков:

Файлы

Для директорий есть функции eachFile и eachFileRecursive:

Для обработки текстовых файлов — функция eachLine:

Писать в файлы так же очень удобно:

Классы

Неизменяемые классы задаются с помощью аннотации Immutable:

При использовании этой аннотации нужно явно указывать, какого типа данных поле.

Операторы

Проверяет переменную a, и если в ней null или false, то берет указанное следом значение. Иначе берется значение переменной a.

«?.» Safe navigation
Используется для избежания ошибки NullPointerException

Вернет null, если если в user содержится null вместо того, чтобы бросать NullPointerException.

«*.» Spread operator
Применяет указанный метод для всех элементов какой-либо коллекции. Эквивалент следующему:

Так же монжо использовать для составления списков и словарей:

Оператор «==» уже перегружен для всех объектов — и вызывает метод «isEquals()». Полный список методов, которые нужно переопределить для перегрузки операторов, доступен здесь: http://groovy.codehaus.org/Operator+Overloading.

SQL запросы обрабатываются очень просто:

В groovy существуют билдеры, которые можно использовать для генерации XML. Для генерации создается экземпляр объекта MarkupBuilder, на котором вызываются псевдо-методы — название этого метода и переданные параметры будет использоваться для генерации тега:

В качестве параметра конструктору MarkupBuilder можно передавать любой PrintWriter:

Парсинг XML так же очень простой:

Groovlets

С помощью класса GroovyServlet возможно запускать скрипты на Groovy как сервлеты.
В первую очередь, для этого нужно добавить несколько строчек в web.xml:

— request & response
— context, application, session
— out (= response.getWriter())
— sout (= response.getOutputStream())
— html (= new MarkupBuilder(out))

Отдаст браузеру сгенерированную html-страницу.

Источник

Groovy как скриптовый язык и DSL для Java

Зачем?

При разработке разного рода ПО, например, задач мониторинга или обслуживания, я сталкиваюсь с необходимостью поддержки в программе выполнения сценариев, описывающих или выполняющих некоторый набор действий. И специфика такова, что добавление или изменение таких сценариев в ПО не должно требовать пересборки или перезапуска ПО.

Наверное, самыми простыми примерами таких сценариев, с которыми все сталкивались в том или ином виде, могут служить обычные пакетные файлы — bat или sh.

В своей практике, я иногда использую XML для описания сценариев. В случае, четко определенного заранее набора действий и их простого плоского набора без ветвлений — XML не плох для использования. Тут и фиксированная структура, позволяющая валидировать файл сценария, и простота самого языка XML, позволяющая с ним работать не только программистам. Однако реализовывать ветвления или условную логику в XML, на мой взгляд, очень накладно и сродни написанию своего мини языка. Расширение набора действий чаще всего возможно только при изменении исходного кода программы, да и изначально реализация поддержки XML сценария трудозатратна.

Читайте также:  какой мультфильм посмотреть с девушкой

В общем, в поисках более простого и функционального инструмента, для описания сценариев, взор был обращен к скриптовым языкам. Так как платформа Java, то хотелось иметь возможности интеграции скриптового языка и Java. В итоге, выбор пал на Groovy – динамический язык на базе JVM, легко интегрируемый с Java, простой и выразительный, имеющий много полезных возможностей для нашей задачи.

Скрипты

Я не буду рассказывать основы Groovy, так как материалов в сети даже на русском уже предостаточно. Остановлюсь лишь на некоторых ключевых для нас моментах.

Groovy позволяет нам из Java кода выполнять не скомпилированный исходный Groovy код, что позволяет нам выполнять сценарии добавленные или измененные в runtime.

Рассмотрим пример выполнения Groovy скрипта в Java. Для поддержки Groovy в Вашем Java проекте нужно подключить в зависимости лишь одну библиотеку «groovy» нужной Вам версии.

Напишем следующий Groovy код в файле x:\GroovyScript.groovy:

Код для выполнения данного скрипта в Вашем Java код может быть таким:

В итоге выполнения, в консоль выведется 2 строки, первая из скрипта, вторая — из Java, с результатом выполнения скрипта:

Groovy script
result=16

Пример не несет функциональной нагрузки в скрипте, однако показывает возможности динамической загрузки и выполнения – всего две строчки кода и мы получаем возможность выполнения скриптов.

Немного о Java коде. GroovyShell – это класс предоставляемый Groovy для выполнения groovy скриптов. Существуют и другие способы выполнения groovy скриптов, подробнее смотрите тут

DSL – domain-specific language или предметно ориентированный язык. Язык, позволяющий использовать основные операции предметной области через набор простых и понятных высокоуровневых функций, скрывающий от пользователя их реализацию.

В приведенном выше примере код достаточно простой, однако в реальном сценарии он может быть очень большим и сложным. И работать с такими скриптами смогут только groovy-разработчики, избежать ошибок без тестирования будет сложно. В случае заранее известных операций в сценариях, всю бизнес логику можно вынести в код (java или groovy — неважно), и предоставить возможность использовать ее через набор функций.

Рассмотрим небольшой пример. Требуется написать скрипт, который будет выполнять архиваций, распаковку архивов, удаление, некоторые проверки и уведомления.
Один их кусочков сценария мог бы быть таким – проверить состояние процесса и в случае его завершения заархивировать каталог и послать уведомление:

//import

//check state
Process p = getProcess ( … )
int state = p. getCompleteState ( … )
if ( state == 1 ) <
//doSomeLogicForArchive
Zip z = new Zip ( … )
z. makeZip ( … )
> else <
//doAnotherLogic
return
>
//doSomeLogicForSendNotify
Smtp smtp = new Smtp ( … )
Message m = new Message ( … )
smtp. send ( to,m. )

Код получается достаточно большим, и он будет понятен, в основном, лишь программистам. Давайте его упростим и вынесем три указанных действия в класс ArchiveScript со статическими методами. Скрипт после вынесения методов:

Уже лучше? — Лучше, но все еще есть артефакты – импорт и названия класса, которые тоже стоило бы убрать. И в Groovy есть подобная возможность – возможность задания базового класса для скрипта вне самого скрипта. Класс ArchiveScript для этого должен наследоваться от Script и методы могут быть не статическими. Код скрипта при этом еще упрощается – исчезает импорт и префикс класса:

Уже достаточно хорошо. В случае если код внутри блока ветвления условия однострочный, можно отказаться и от фигурных скобок. А в случае Groovy часто и от скобок справа от имени метода. Код выполнения скрипта немного усложняется — нужно создать объект CompilerConfiguration, установить значение scriptBaseClass равное имени созданного нами класса ArchiveScript и передать этот объект в GroovyShell:

CompilerConfiguration conf = new CompilerConfiguration ( ) ;
conf. setScriptBaseClass ( «package.ArchiveScript» ) ;
GroovyShell shell = new GroovyShell ( conf ) ;

Далее, давайте рассмотрим, как задаются параметры методов в скрипте при вызове. В случае определения в классе ArchiveScript метода makeArchive в таком виде:

def makeArchive ( sourcePath, destPath, deleteSource )

В скрипте вызов должен был бы выглядеть так:

И если говорить о наглядности и даже удобстве Groovy позволяет нам сделать передачу параметров через именованные параметры, так:

Однако в этом случае параметры будут передаваться внутри HashMap и, соответственно, получение параметров в makeArchive в классе ArchiveScript должно быть таким:

Если применить преобразование и для других вызовов, то в конечном итоге наш скрипт мог бы выглядеть так:

И это уже не слишком сложный и достаточно читаемый код.

Таким образом, мы получили свой мини-DSL с несколькими предопределенными функциями, специфичными для нашей задачи. А также все еще имеем возможность использовать всю мощь исходного языка.

Замечу, что я рассмотрел лишь малую толику разработки DSL. В Groovy есть более широкая поддержка разработки своего DSL, а так же DSL-поддержка для Eclipse и для IntelliJ Idea

Тестирование

Хотелось бы сказать несколько слов о тестировании сценариев. Каким бы простым не был скрипт, ошибки могут быть и в нем. Даже если Вы пишите сценарии в IDE, полноценной проверки на корректность синтаксиса Вы можете не получить. Это возможно лишь при его выполнении. Так же необходимо проверять поведение скрипта.
Так как нам не хотелось бы выполнять реальные действия при выполнении тестирования сценария, то нужно каким-то образом заменить реальную логику на имитацию. Groovy позволяет нам это сделать многими путями. Покажу несколько из них.

Читайте также:  что делать если контактировал с зараженным коронавирусом 2021
Замена базового скрипта

Создаем новый класс ArchiveSciptMock который имеет интерфейс аналогичный ArchiveScript, и реализующий нужное нам поведение (или ничего не делающий). При создании объекта конфигурации CompilerConfiguration передаем его имя вместо оригинала.

CompilerConfiguration conf = new CompilerConfiguration ( ) ;
conf. setScriptBaseClass ( «package.ArchiveScriptMock» ) ;

Замена методов в базовом классе скрипта

Другим вариантом без создания дополнительного mock класса может быть замена методов на mock в самом ArchiveScript. В groovy это можно сделать, например, таким способом:

Недостатком и первого и второго способа я бы считал необходимость написания дублирующей логики по проверки правильности передаваемых параметров. Так как если в ArchiveScriptMock метод makeArchive будет таким:

def makeArchive ( params ) <
//makeArchiveInternal params.sourcePath, params.destPath, params.deleteSource
>

То мы не проверим все ли параметры были переданы. Нужно будет писать что-то похожее на это:

Я бы предложил сделать небольшой рефакторинг ArchiveScript — сделать ArchiveScript фасадом и всю логику перенести в другой класс. Например, в Java класс Archive.
Рефакторинг — не только для целей тестирования, но и из других соображений, например, для отделения поведения от способа выполнения (нет зависимости от Script). В итоге, после изменения, ArchiveScript примет такой вид:

Теперь, можно тестировать логику и сценарий в отдельности. Заменим Archive на его mock и выполним скрипт:

Естественно поведение Archive можно заменить и с помощью java mock фреймворков, однако, нам пока достаточно и этого.

Я считаю, что получил достаточно гибкий инструмент для написания сценариев, без недостатков, озвученных в начале текста, а также достаточно простотой в использовании. Контроль корректности сценария так же не был потерян — использование mock поведения позволяет нам тестировать их в достаточной мере, перед реальным выполнением.

Проект с исходными кодами проекта — groovydsl. Компилируется Gradle через враппер.

Некоторые идеи взяты из книги Groovy for Domain-Specific Languiages, Fergal Dearle, 2010

Источник

Groovy или Java: подробное сравнение и советы по выбору языка

Согласно последним статистическим данным индекса сообщества программистов TIOBE, Java остается одним из самых популярных языков разработки программного обеспечения среди профессиональных разработчиков.

По данным TIOBE, в прошлом году Java заняла первое место; в этом году он опустился на вторую позицию.

Несмотря на высокую популярность Java, данные опроса Stack Overflow показывают, что существует большое количество разработчиков, которые больше не хотят использовать этот язык.

Одна из причин, по которой популярность Java падает, заключается в том, что день ото дня появляются более удобные альтернативы.

Apache Groovy — один из языков программирования, который может дополнять, а в некоторых случаях даже заменять Java.

Сегодня Groovy занимает 31-е место в рейтинге самых популярных языков программирования. Ранее он несколько раз попадал в топ-20.

Несмотря на то, что Apache Groovy — это язык программирования, совместимый с Java, для платформы Java, между Groovy и Java все же существует большая разница.

В этой статье мы рассмотрим основные различия между Groovy и Java, чтобы понять, когда лучше всего использовать каждый из двух языков.

Почему стоит обратить внимание на Java

Разработчики используют платформу Java для работы над множеством проектов, от настольных, веб-приложений и мобильных приложений до обработки больших данных и многого другого.

В течение многих лет язык Java был очень популярен, и сегодня многие компании нанимают Java-разработчиков, чтобы получить ценное программное обеспечение и расширить возможности для бизнеса.

Почему разработчики предпочитают Java? Вот несколько моментов, которые могут это объяснить:

Java — зрелый язык

Учитывая, что язык Java очень распространен и проверен временем, он очень стабилен и предсказуем в отношении разработки программного обеспечения, особенно когда речь идет о корпоративной разработке.

Причина тому — очень богатая экосистема проверенных фреймворков и библиотек, которые Java предлагает разработчикам.

Кроме того, распространение этого языка предоставляет компаниям широкий круг талантов — поскольку Java изучают в школах и университетах, и для многих разработчиков этот язык является первым языком программирования, который они изучают.

Поэтому компании, которые хотят найти Java-разработчика, всегда имеют множество потенциальных подрядчиков с богатым опытом и передовыми навыками в разработке Java.

Благодаря поддержке Oracle и сообщества Java, язык постоянно развивается, что делает его еще более стабильным и надежным.

Итак, если Java так широко распространена, почему предприятиям следует рассматривать какие-либо альтернативы?

Почему стоит обратить внимание на Groovy

Хотя Java по-прежнему является одним из наиболее широко используемых объектно-ориентированных языков программирования в ИТ-индустрии, Groovy имеет несколько преимуществ, которые делают его не менее эффективным при разработке программного обеспечения.

Groovy может предоставить даже больше возможностей, чем Java

Groovy основан на мощи кода Java, но помимо этого Groovy сочетает в себе сильные стороны других языков.

Python, Ruby и Smalltalk также повлияли на Groovy и некоторые его функции — проверку типа данных диапазона, буквальную нотацию карт и списков и многое другое.

Тем не менее, Groovy может быть как статическим, так и динамическим языком, в зависимости от того, как вы его используете. Он основан на грамматике Java, поэтому каждый разработчик, изучающий Groovy, в некоторой степени является разработчиком Java.

Читайте также:  какой кал должен быть у ребенка 2 месяца на искусственном вскармливании

Кроме того, разработчики, которые программируют на Groovy, получают доступ к ценным функциям, вдохновленным другими языками разработки, которые облегчают процесс разработки и делают его более эффективным.

Groovy может дополнять Java

Groovy и Java имеют некоторые общие черты.

Например, Groovy можно использовать как язык сценариев и программирования для платформы Java. Groovy также может работать с библиотеками и кодом Java, а также компилироваться в байт-код виртуальной машины Java (JVM).

Таким образом, компании могут объединить возможности обоих языков, чтобы получить максимальную отдачу.

Apache Groovy с открытым исходным кодом

Groovy имеет открытый исходный код, что позволяет разработчикам постоянно улучшать его, а также обмениваться идеями и опытом.

Многие компании используют Apache Groovy и извлекают из него выгоду

Большое количество компаний, таких как Starbucks, TransferWise, Learningpod, Rumble и Craftbase, успешно используют Groovy для своих бизнес-нужд.

По-видимому, это не полный список компаний, и язык используется в различных сферах, таких как разработка САПР, банковское дело и финансы, страхование, биомедицинские исследования и т.д.

Теперь, когда мы знаем основные преимущества Java и Groovy, давайте посмотрим, чем они отличаются.

В чем основные различия между Apache Groovy и Java

Сложность и удобство

Java — мощный и «тяжеловесный» язык, что делает его довольно сложным в использовании.

С другой стороны, Groovy — это функциональный статический и динамический язык на основе JVM, способный упростить процесс разработки Java.

Для большинства разработчиков Java изучить Groovy довольно легко, а это означает, что они могут быстро освоить новые навыки и расширить возможности языка Java.

Еще один важный момент: разработчики отмечают, что Groovy значительно упрощает модульное тестирование. Некоторые из них даже называют Apache Groovy языком разработки, ориентированным на тестирование.

Например, такие инструменты, как Spock, основанная на спецификациях и описательная среда модульного тестирования, расширяют возможности и в то же время упрощают процесс модульного тестирования.

Groovy-тесты можно легко добавить в систему Java. В интегрированных средах разработки синтаксис Groovy также обеспечивает поддержку выполнения тестов.

Также есть Geb. Geb — это инструмент автоматизации браузера Groovy, который создает сценарии тестирования E2E. Даже разработчики с небольшим опытом могут создавать свои собственные тесты автоматизации браузера с помощью этого решения.

Существует ряд дополнительных технических преимуществ, которые позволяют разработчикам Groovy быть более продуктивными:

Интеграция

Еще одно различие между двумя языками заключается в том, что Java и Groovy имеют разные возможности интеграции.

Хотя Java подходит для любых приложений и библиотек на основе JVM, ее можно использовать с несколькими сторонними инструментами, такими как Ant, Maven и Gradle.

Groovy также легко интегрируется с любыми библиотеками, объектами и инструментами Java, поэтому он мгновенно предоставляет приложению такие функции, как возможности создания сценариев, функциональное программирование, метапрограммирование и создание языков для конкретных предметных областей.

Помимо инструментов на основе Java, Swagger Codegen, Micronaut Framework, Vert.x и Grails — некоторые другие популярные инструменты, которые можно интегрировать с Groovy.

Сообщество

У Java есть огромное сообщество, членами которого являются признанные профессионалы отрасли.

Сообщество Apache Groovy, с другой стороны, еще не так развито. Тем не менее, он может показаться более дружелюбным, открытым, привлечь много молодых и талантливых разработчиков и побудить их изучать язык.

Тем не менее, разработчики как Java, так и Groovy всегда могут полагаться на советы коллег, но сообщество Java намного больше.

Пространство для возможностей

Как упоминалось выше, на Groovy сильно повлияли другие языки программирования, поэтому он может предложить разработчикам больше возможностей и функций, чтобы сделать работу более продуктивной и эффективной. Вот несколько примеров этих функций:

Некоторые различия между Java и Apache Groovy позволяют сказать, что язык Groovy в некотором смысле является современной и продвинутой версией Java.

Однако у каждого языка есть свои особенности, которые следует учитывать при выборе языка для разработки приложений.

Когда лучше выбрать Apache Groovy или Java

С одной стороны, компании используют Groovy как довольно инновационный язык, который хорошо совместим с виртуальной машиной Java и может значительно облегчить работу разработчиков, а также ускорить реализацию проекта.

С другой стороны, Java — чрезвычайно популярный язык программирования, который помог тысячам компаний сделать свой бизнес более успешным.

Однако у обоих языков могут быть свои сильные и слабые стороны и варианты использования.

Когда лучше использовать Java

Java может быть хорошим выбором, если масштабируемость и производительность имеют решающее значение и если компания разрабатывает веб-приложения.

Крупные компании в таких сферах, как оборона, банковское дело и финансы, здравоохранение, выбирают Java, поскольку она проверена временем и часто используется для разработки сложных корпоративных проектов.

Когда лучше использовать Groovy

Groovy-программирование можно успешно использовать в различных сценариях, от экспериментов с новыми API-интерфейсами до манипуляций со строками и обработки данных.

Кроме того, Groovy поддерживается широким спектром фреймворков, таких как Micronaut, Griffon, Spring Boot и Ratpack, что также помогает упростить работу инженеров.

Выбор между двумя языками является ситуативным и будет зависеть от конкретных требований конкретного проекта.

Источник

Сказочный портал