Статьи

Отличный Java-компаньон — введение

Некоторые из нас приходят на Java из языков сценариев, таких как Python, Ruby или Perl.

Почти все в Java увлекательно, но мелочи раздражают нас. Java — это подробный язык программирования, и написание программ, схожих по функциональности со скриптами, обременительно. Работа с такими вещами, как XML, JSON, даже Strings, не очень удобна. Вещи, которые должны быть простыми, неуклюжи. Слава Богу, есть множество сторонних библиотек, таких как Apache Commons, Guava, Gson, которые делают нашу жизнь осуществимой. Попробуйте переписать программу с Perl на Java. Представьте себе исходный код с множеством регулярных выражений, которые являются первоклассными компонентами в Perl. Тогда до вас доходит, что вы должны избегать двойных кавычек и синтаксис немного отличается, и вы не можете просто скопировать, вставить. Вы можете представить, что большинство регулярных выражений потребуют изменений, и, таким образом, весь процесс приводит к отладке регулярных выражений, и это похоже на кошмар. Поэтому разработчики Java в таких случаях сказали бы, что я хотел бы написать на Python … Я бы написал это быстрее и исходный код был бы на 50% короче, но я должен написать это, к сожалению, на Java …

Другой случай, Scala новый современный язык JVM в последнее время становится все более и более популярным. Его цель — заменить Java. Часто я слышал, когда разработчики говорили: видели ли вы, что он может делать с коллекциями? это гораздо более лаконичный язык, чем Java, и он поддерживает модель Actors, которая упрощает работу с параллелизмом. Это круто! Но есть и некоторые недостатки, Scala довольно требовательный, сложный в освоении, кривая обучения довольно крутая. Кроме того, есть проблемы с зависимостями, вы должны придерживаться определенной версии. Язык настолько сложен, что также часто я слышу от разработчиков Java, да, Scala, я пробовал его, но я отказался от него, это было слишком сложно.

Еще один случай, когда некоторые разработчики перед реализацией большого проекта создают своего рода прототип, чтобы проверить свои предположения при проектировании. И им не хватает времени для реализации прототипа в многословной Java. Конечно, они могли бы реализовать это на Python, но было бы неплохо иметь возможность повторно использовать уже проделанную работу и потраченное время…

Теперь приходит Groovy современный динамический язык JVM, который не был разработан как Scala, чтобы быть заменой Java, но был Java Companion. Это делает мир различий. Groovy также не является конкурентом Scala. Он удовлетворяет местам, где отсутствует Java, и делает возможным простое создание сценариев и возможность быстрой разработки. Кривая обучения не очень крутая, в начале просто измените расширение файла Java на Groovy, и это все.

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

Одним из его сильных сторон является возможность создания так называемого предметно-ориентированного языка — DSL. Самым важным и известным DSL является Gradle, инструмент автоматизации сборки. он создан в Groovy. Это идеальное решение, потому что в отличие от Java, где основой DSL является XML. DSL в xml неудобен в обслуживании, разработке и отладке. Когда DSL написан на Groovy с добавлением новых функций, он просто пишет нормальный код. Это гораздо естественнее и проще. Это может вас удивить, но Gradle содержит плагины для Scala и JavaScript.

Groovy содержит много вещей, которые мы упускаем в Java, такие как легкое построение и анализ xml, json. Функция, которая уже содержит Scala и будет самым важным изменением в Java 8, лямбда-выражения называются другими способами замыканий. Замыкания являются чем-то вроде указателя на метод и являются первоклассными гражданами Groovy. Замыкание может быть определено как метод, заключенный в фигурные скобки, а затем, например, передан как аргумент метода. Их можно назвать лениво. Закрытие делает работу с коллекцией очень простой.

1
2
3
4
def list = ['a','b','c','d']
 def upperCase = list.collect { it.toUpperCase() }
 assert list instanceof ArrayList
 assert upperCase == ["A", "B", "C", "D"]

Этот небольшой фрагмент кода показывает мощь Groovy. Первый список — Java ArrayList, но он создан и инициализирован с меньшим количеством кода. Затем метод collect, который перебирает всю коллекцию, вызывая замыкание для каждого элемента. Закрытие заключено в фигурные скобки, это означает текущий элемент коллекции, поэтому этот код перебирает ArrayList и вызывает метод toUpperCase () для каждого элемента. Простой, мощный, элегантный.

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

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

И так далее, и так далее. Я подготовил проект на GitHub, чтобы представить некоторые интересные возможности Groovy: https://github.com/zsokolowski/Groovy-TJUG

Groovy динамичный. Это означает, что типы выводятся из контекста. Благодаря ключевому слову def возможна типизация потока, это означает, что вы можете изменить тип переменной, просто назначив другой тип. Динамический также означает, что вы можете любое поведение класса во время выполнения. Благодаря тому, что методы и переменные вызываются косвенно через так называемый Meta Object Protocol, вы можете добавлять, изменять методы и свойства в классе, даже во время выполнения. Например, Groovy 2.1.3 добавляет 250 методов к известному классу Java String, и вы можете добавить их больше, и они могут делать все, что вы можете себе представить. Конечно, ничего не бесплатно, поэтому у этого динамического поведения есть два недостатка. Во-первых, ошибки видны во время выполнения, во-вторых, снижение производительности.

Во-первых, это не создает такой большой проблемы, потому что современная IDE, такая как моя любимая IntelliJ Idea, очень помогает, просто окрашивая синтаксис. Если этого недостаточно, специальные аннотации могут изменить поведение Groovy. А именно @TypeCheck и @CompileStatic. Первая заставляет Groovy проверять переменные, имена методов и возвращаемые типы, чтобы исключить опечатки и принудительно писать код. Но всегда есть цена, на этот раз вы теряете силу метапрограммирования, то есть такие функции, как добавление методов во время выполнения. Код, сгенерированный таким образом, хотя статически проверенный будет таким же, как динамически проверенный. Только компилятор стал сварливым. Производительность программы будет такой же, как и в чисто динамическом режиме. Если вам нужна производительность, аналогичная Java, и вы используете более старую, чем Java 7, вторая аннотация, кроме статической проверки типов, заставляет Groovy создавать статический код. Код, сгенерированный таким образом, будет похож на код, созданный Java. Хотя вы все еще выигрываете от более лаконичного исходного кода. Для более новой Java есть еще одна альтернатива.

Java 7 представила новую инструкцию байт-кода под названием invokeDynamic . Это меняет правила игры, потому что до Java 7 код вызывался либо классами отражения или прокси. Даже при использовании так называемого кеш-сайта, который ускоряет производительность, результаты значительно хуже (медленнее), чем в Java. В настоящее время благодаря дескрипторам метода и invokeDynamic, который вызывает специальный метод-заглушку, который, в свою очередь, вызывает метод-приемник, весь процесс происходит намного быстрее. Эта функциональность будет интенсивно использоваться в Java 8. Да, Java 8 будет гораздо более динамичной, чем предшественники.

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

Где Groovy используется? В Groovy реализован ряд хорошо известных фреймворков, перечислим несколько из них:

  • Grails — фреймворк быстрой разработки сайтов
  • Gradle — упомянутый выше инструмент автоматизации сборки, в настоящее время он используется даже в проекте Android
  • Spock — мощный фреймворк для тестирования, похожий на Mockito
  • GPars — библиотека параллелизма, использующая модель Actor

И многие другие, Groovy стал вторым языком для Spring Framework.

Ссылка: Groovy Java companion — знакомство с нашим партнером по JCG Збигневом Соколовским в блоге, посвященном технологии jvm .