Groovy
Groovy — объектно-ориентированный язык программирования, разработанный для платформы Java как дополнение к языку Java с возможностями Python, Ruby и Smalltalk.
Groovy | |
---|---|
Класс языка | объектно-ориентированный язык программирования, императивный язык программирования, сценарный язык, язык функционального программирования, мультипарадигмальный язык программирования, интерпретируемый язык программирования, язык JVM, открытое программное обеспечение и свободное программное обеспечение |
Появился в | 2003 |
Автор | Джеймс Стрэкен |
Разработчик | Java Community Process и Apache Software Foundation |
Расширение файлов |
.groovy |
Выпуск | 3.0.8[1] (16 апреля 2021) |
Система типов | статическая и динамическая |
Испытал влияние | Java, Ruby, Python, Perl, Smalltalk |
Повлиял на | Kotlin, Swift |
Лицензия | Apache License 2.0 и лицензия Apache |
Сайт | groovy-lang.org |
ОС | кроссплатформенность |
Использует Java-подобный синтаксис с динамической компиляцией в JVM байт-код и напрямую работает с другим Java-кодом и библиотеками. Язык может использоваться в любом Java-проекте или как скриптовый язык. Активно используется как Предметно-ориентированный язык для написания скриптов при работе в предметной области (от математики до обработки научных данных), а также сборки и тестирования приложений (Gradle).
Groovy завершил процесс стандартизации в Java Community Process (JSR 241).
Основные возможности языка, отличающие его от Java: как статическая, так и динамическая типизация; встроенный синтаксис для списков, ассоциативных массивов, массивов и регулярных выражений; перегрузка операций. Замыкания в Groovy появились задолго до Java.
На Groovy созданы:
- веб-фреймворк Grails, основное применение язык нашёл именно в сочетании с ним.
- неблокирующий веб-фреймворк Ratpack.
- веб-фреймворк для создания сайтов и приложений на микросервисах Micronaut.
- фреймворк для тестирования приложений Spock.
- десктоп фреймворк Griffon.
- фреймворк для тестирования веб-сайтов Geb.
- фреймворк для параллельных и распределенных вычислений с использованием системы "акторов" Gpars.
- программный комплекс SDKMAN! для управления версиями языков Java, Groovy, Scala, Kotlin, Ceylon и приложений как: Ant, Gradle, Grails, Maven, SBT, Spark, Spring Boot, Vert.x (список всех).
- ORM обертка над базами данных GORM.
История
Первым упоминанием о языке было сообщение в блоге Джеймса Строна (англ. James Strachan)[2] от августа 2003 года. Позднее было выпущено несколько версий между 2004 и 2006 годами. После того, как начался процесс стандартизации JCP, нумерация версий была изменена, и версию называют «1.0». Версия «1.0» была выпущена 2 января 2007 года. В декабре 2007 года вышел Groovy 1.1, эта версия вскоре была перенумерована как «1.5» вследствие значительных изменений в языке.
Стрэчен покинул проект за год до релиза Groovy 1.0 в 2007 году, а в июле 2009 года Стрэчен написал в своём блоге, что возможно не создал бы Groovy, если бы в 2003 году прочитал книгу Мартина Одерского с соавторами о программировании на языке Scala (вышедшую в 2007 году)[3].
Проект разработки языка и комитет JSR-241 с 2007 года возглавляет Гийом Лафорж (Guillaume Laforge). Компанию G2One, занимавшуюся развитием и коммерциализацией языка и фреймворка Grails, осенью 2008 года приобрела SpringSource, в итоге через цепочку слияний и поглощений (VMware, Pivotal, EMC) актив перешёл в 2017 году в корпорацию Dell. С 2015 года язык является проектом верхнего уровня фонда Apache.
В 2020 году вышла версия 3.0.0 с целым пакетом улучшений и достоинств:
- do-while циклы, лямбда выражения, try-with-resources,code blocks (анонимные блоки кода).
- инициализация массива в "Java style" (
new int[] {1, 2, 3}
). - дефолтные(default) методы в интерфейсе.
- новые операторы сравнения и Элвис-оператор.
- инициализация не статических внутренних классов (
outer.new Inner()
) - безопасные индексы (
nullableVar?[1, 2]
)
Поддержка IDE
Программирование на Groovy поддерживается в основных интегрированных средах разработки [4]программного обеспечения, в частности:
- IntelliJ IDEA начиная с версии 7 или для более ранних версий с использованием JetGroovy Plugin;
- Eclipse с использованием Groovy Eclipse;
- Netbeans — встроен в NetBeans IDE.
- VS Code - поддерживается через расширение.
- Vim - поддерживается через расширение.
Более полный список всех IDE и редакторов находится здесь.
Скрипты и код можно писать и запускать 4 видами:
- в Groovy Console набирать и запускать.
- в IDE набирать, отлаживать и запускать.
- в Groovy Shell набирать в интерактивном режиме.
- в браузере через Groovy Web Console без установки на свой компьютер.
Установка и настройка
На странице загрузки устанавливаем Groovy самым удобным способом (предварительно установив Java (JDK)).
Перед запуском проверьте чтобы в путях Вашей ОС были прописаны переменная GROOVY_HOME и путь в переменной PATH к исполняему файлу groovy.bat (или groovy.sh)
Проверить работу и версию можно набрав в консоли: groovy -v
Использование Groovy
Последние версии генератора отчётов iReport, основанного на Java-библиотеке JasperReports, позволяют встраивать в отчёты выражения на Groovy и писать на нём дополнительную логику.
Система непрерывной интеграции Jenkins позволяет использовать сценарии автоматизации, созданные на Groovy.
Приложение для тестирования веб-сервисов SoapUI поддерживает написание тестовых скриптов на Groovy.[5]
Примеры
Классический пример вывода на печать строки с приветствием:
// Comment
print("Hello world!")
Пример создания и использования функции с аргументами и возвращаемым значением:
def helloFunction(name) {
println("Hello, ${name}")
}
helloFunction("Groovy!")
// В следующей функции вычисления суммы двух объектов
// последнее выражение является возвращаемым значением
def sum(a, b) {
a + b // вернет результат сложения
}
print(sum(1, 2))
// Эта функция принимает параметры только числового типа
def subtraction(double a, double b) {
return a - b
}
print(subtraction(6, 4))
Объявление класса, создание его экземпляра и вызов его методов в главной точке входа программы (статический метод main())
class Foo {
def doSomething() {
def data = ["name": "James", "location": "London"]
for (e in data) {
println("entry ${e.key} is ${e.value}")
}
}
def closureExample(collection) {
collection.each { println("value ${it}") }
}
static void main(args) {
def values = [1, 2, 3, "abc"]
def foo = new Foo()
foo.closureExample(values)
foo.doSomething()
}
}
";" — точка с запятой в конце строки не обязательна.
Ещё пример, демонстрирующий возможности синтаксиса Groovy. Вывод на печать массива(список) строк:
["Rod", "Carlos", "Chris"].each{ println it }
Стандартная переменная it внутри метода each указывает на текущий элемент массива).
Начиная с версии 3.0.8 ключевое слово var теперь аналогично слову def (как и в Java):
var text = "some a text"
println text
Особенности работы
Так же, как начиная с 11 версии Java, исходный код Groovy может быть выполнен как обычный скрипт. Для этого он должен содержать код вне определения класса или класс с методом main, или Runnable, или GroovyTestCase:
#!/usr/bin/env groovy
println "I can execute this script now!"
Строки в Groovy: Java Strings с одинарными кавычками и GStrings с двойными кавычками.
def javaStyleString = 'java String style'
def GStringsStyleString = "${javaStyleString}"
def j = '${javaStyleString}'
def bigGroovyString = """
${javaStyleString}
${GStringsStyleString}
"""
println bigGroovyString
Groovy неявно генерирует методы для доступа к переменным (setColor(String color) и getColor()):
class AGroovyBean {
String color
}
def myGroovyBean = new AGroovyBean()
myGroovyBean.setColor('blue')
assert myGroovyBean.getColor() == 'blue'
myGroovyBean.color = 'green'
assert myGroovyBean.color == 'green'
Groovy предлагает простой и последовательный доступ к спискам, отображениям и массивам:
def myList = ['One', 'Two', 'Three'] //выглядит как массив, но это список
assert myList[2] == 'Three'
myList[3] = 'Four' //добавляем элемент в список
assert myList.size() == 4
def monthMap = [ 'January' : 31, 'February' : 28, 'March' : 31 ] //определяем ассоциативный массив
assert monthMap['March'] == 31
monthMap['April'] = 30 //добавляем элемент в ассоциативный массив
assert monthMap.size() == 4
Closure (замыкание) — это анонимная функция и объект в одном виде:
def closureFunction = {a, b ->
println a
println b
}
closureFunction(1, 2)
return в функции указывать не обязательно — по умолчанию будет возвращено значение последней упомянутой переменной.
Передачу параметров в методы, замыкания или функции можно делать без скобок:
closureFunction 1,2
Параметры с установленными значениями:
def say(msg = 'Hello', name = 'world') {
"$msg $name!"
}
// We can invoke 3 signatures:
// say(), say(msg), say(msg, name)
assert 'Hello world!' == say()
// Right most parameter with default value is eliminated first.
assert 'Hi world!' == say('Hi')
assert 'Howdy, mrhaki!' == say('Howdy,', 'mrhaki')
Множественное присваивание переменных:
// Assign and declare variables.
def (username, email) = ['mrhaki', 'email@host.com']
// We can assign later than the definition of the variables.
int housenr
String streetname
(streetname, housenr) = ['Old Street', 42]
// We can also use type declerations.
def (String streetName, int houseNumber) = ['Old Street', 42]
// Return value of method can be assigned to multiple variables.
def iAmHere() {
[29.20090, 12.90391]
}
def (coordX, coordY) = iAmHere()
Запуск нового потока при объявлении с ключевым словом "as" которое приводит объект Thread к интерфейсу Runnable:
// Use as to treat closure as implementation for
// the Runnable interface:
def t = new Thread({ println 'hello' } as Runnable)
t.start() // Output: hello
Неизменяемые классы маркируются с помощью аннотации Immutable:
@Immutable
class ImmutableClass {
String stringVariable
Integer integerVariable
}
def newVariable = new ImmutableClass(stringVariable : "some string", integerVariable : 23)
Traits - это интерфейс и его стандартная реализация и состояние в одном месте:
trait UserTrait {
abstract String name()
String showName() {
return "Hello, ${name()}!"
}
}
class Employee implements UserTrait {
String name() {
return 'Bob'
}
}
def emp = new Employee() as UserTrait
println emp.name()
println emp.showName()
trait Id {
Long id = 0
}
trait Version {
Long version = 1
}
class Person {
String username
}
def person = new Person(username: 'mrhaki')
def domainPerson = person.withTraits Id, Version
assert domainPerson.id == 0
assert domainPerson.version == 1
Свой менеджер зависимостей Grape позволяет загружать необходимые библиотеки и файлы из maven репозитариев при вызове из командной строки (файл - testJetty.groovy):
import org.eclipse.jetty.server.Server
import org.eclipse.jetty.servlet.*
import groovy.servlet.*
@Grab(group='org.eclipse.jetty.aggregate', module='jetty-all', version='7.6.15.v20140411')
def startJetty() {
vertx.createHttpServer().requestHandler({ req ->
req.response()
.putHeader("content-type", "text/plain")
.end("Hello from Jetty!")
}).listen(8080)
}
println "Starting Jetty, press Ctrl+C to stop."
startJetty()
Примечания
- The Apache Groovy programming language - Groovy 3.0.8 Changelog
- James Strachan. Groovy — the birth of a new dynamic language for the Java platform Архивировано 5 апреля 2007 года.
- Scala as the long term replacement for java/javac? (6 июля 2009). Дата обращения: 7 января 2012. Архивировано 10 февраля 2012 года. «I can honestly say if someone had shown me the Programming in Scala book by by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I’d probably have never created Groovy»
- Список поддерживаемых IDE Архивировано 4 февраля 2008 года. на официальном сайте Groovy Архивировано 2 марта 2014 года.
- SOAP UI: Sample Scripts on Groovy .
Ссылки
- Home (англ.). — домашняя страница проекта. Дата обращения: 5 июня 2006. Архивировано 13 февраля 2012 года.
- JSR 241: The Groovy Programming Language (англ.). JSRs: Java Specification Requests. — домашняя страница проекта. Дата обращения: 5 июня 2006. Архивировано 13 февраля 2012 года.
- https://ru.wikibooks.org/wiki/Groovy - Учебник по языку Groovy.
- Хики, Скотт Groovy на практике: сокращение кода с помощью Groovy (19 сентября 2006). Дата обращения: 26 ноября 2006. Архивировано 13 февраля 2012 года.
- Эндрю, Гловер Развитие Groovy (1 ноября 2007). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Эндрю, Гловер Разметка с помощью Groovy Builders (12 октября 2007). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Эндрю, Гловер Функциональное программирование с помощью использованием замыканий и карринга (9 января 2008). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Эндрю, Гловер Подмешайте немного Groovy в приложения Java (14 февраля 2008). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Эндрю, Гловер Ускорение модульного тестирования кода Java с помощью Groovy (25 декабря 2007). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Эндрю, Гловер Написание сценариев Ant с помощью Groovy (21 января 2008). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Эндрю, Гловер Программирование JDBC с помощью Groovy (12 декабря 2007). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Эндрю, Гловер Вперед, на сервер, с Groovy (30 января 2008). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Чэд, Медоуз Углубитесь в Hierarchical Inherited Rule-Interpreted XML (30 августа 2007). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Эндрю, Гловер MOP и мини-языки (6 февраля 2008). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Эндрю, Гловер Хитрые операторы (4 сентября 2008). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Groovy for the Office (англ.). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Groovy Zone - DZone Groovy news aggregator (англ.). Дата обращения: 7 сентября 2008. Архивировано 13 февраля 2012 года.
- Плагин для языка Groovy для IDE IntelliJ IDEA
- Изменения в языке версии 3.0