ТТррееннииннгг:: 
GGrroooovvyy —— ммллааддшшиийй ббрраатт 
JJaavvaa ннаа ввеещщеессттвваахх 
ББаарруухх ССааддооггууррссккиийй 
@@jjBBaarruucchh
Java & Groovy - братья на век! 
• Java код ~=> валидный Groovy код! 
• Меньше Boilerplate! 
• Перегрузка операторов! 
• Больше функциональщины! 
• У Groovy классов есть метакласс! 
• У Groovy есть AST трансформации!
Java код ~=> валидный Groovy код! 
•Не поддерживаются: 
• Внутренние классы (не нужны) 
• Инициализация множественных переменных в for 
• Создание массива на лету (поддерживается, но не так) 
• Синтаксис 8 (ещё аж 2 недели!) 
• Checked exceptions
Меньше Boilerplate 
// Groovy bean 
class CourseBean { 
String title 
} 
def groovyCourse = new CourseBean() 
groovyCourse.setTitle('Groovy') 
assert groovyCourse.getTitle() == 'Groovy' 
groovyCourse.title = 'Groovy rulez' 
assert groovyCourse.title == 'Groovy rulez'
Перегрузка операторов 
Оператор Метод Уже переопределен в 
а + b a.plus(b) Number, String, StringBuffer, 
Collection, Map, Date, Duration 
а[b] a.getAt(b) Object, List, Map, CharSequence, 
Matcher, и ещё много где 
a << b a.leftShift(b) Используется много где как синоним к append 
switch(a){ 
case b: 
} 
a in b 
b.isCase(a) 
Object, Class, Range, Collection, 
Pattern, Closure; 
Позволяет использовать любой класс в switch 
a == b a.equals(b) В Груви == запускает equals 
a <=> b a.compareTo(b) java.lang.Comparable 
a as type 
a.asType(typeClas 
s) 
везде
Больше функциональщины 
// data.txt 
//>>first line 
//>>second line 
// Замыкания (здесь зарыты грабли) 
def number = 0 
new File('data.txt').eachLine { line -> 
number++ 
println "$number: $line" 
} 
Получаем: 
1: first line 
2: second line
У Groovy классов есть метакласс 
//Добавляем/переопределяем метод/свойство для объекта 
Person p = new Person() 
p.metaClass.nickName = ‘John Doe’ 
p.metaClass.sayGoodBye << {println ‘Good bye!’} 
println p.getNickName() 
p.sayGoodBye() 
//Добавляем метод к классу 
Person.metaClass.printName = {println delegate.name} 
delegate – обращение к объекту 
Все объекты созданные до того, как метод был добавлен, не будут его 
иметь
У Groovy есть AST трансформации 
//Что написали: 
@Cannonical 
Class Person { 
String firstName 
String lastName 
} 
Что получили: 
• Геттеры и Сеттеры 
• Конструкторы на все случаи 
жизни 
• С именными параметрами тоже 
• equals() 
• hashCode() 
• toString()
ККООННЕЕЦЦ
ККООННЕЕЦЦ

Groovy

  • 1.
    ТТррееннииннгг:: GGrroooovvyy ——ммллааддшшиийй ббрраатт JJaavvaa ннаа ввеещщеессттвваахх ББаарруухх ССааддооггууррссккиийй @@jjBBaarruucchh
  • 2.
    Java & Groovy- братья на век! • Java код ~=> валидный Groovy код! • Меньше Boilerplate! • Перегрузка операторов! • Больше функциональщины! • У Groovy классов есть метакласс! • У Groovy есть AST трансформации!
  • 3.
    Java код ~=>валидный Groovy код! •Не поддерживаются: • Внутренние классы (не нужны) • Инициализация множественных переменных в for • Создание массива на лету (поддерживается, но не так) • Синтаксис 8 (ещё аж 2 недели!) • Checked exceptions
  • 4.
    Меньше Boilerplate //Groovy bean class CourseBean { String title } def groovyCourse = new CourseBean() groovyCourse.setTitle('Groovy') assert groovyCourse.getTitle() == 'Groovy' groovyCourse.title = 'Groovy rulez' assert groovyCourse.title == 'Groovy rulez'
  • 5.
    Перегрузка операторов ОператорМетод Уже переопределен в а + b a.plus(b) Number, String, StringBuffer, Collection, Map, Date, Duration а[b] a.getAt(b) Object, List, Map, CharSequence, Matcher, и ещё много где a << b a.leftShift(b) Используется много где как синоним к append switch(a){ case b: } a in b b.isCase(a) Object, Class, Range, Collection, Pattern, Closure; Позволяет использовать любой класс в switch a == b a.equals(b) В Груви == запускает equals a <=> b a.compareTo(b) java.lang.Comparable a as type a.asType(typeClas s) везде
  • 6.
    Больше функциональщины //data.txt //>>first line //>>second line // Замыкания (здесь зарыты грабли) def number = 0 new File('data.txt').eachLine { line -> number++ println "$number: $line" } Получаем: 1: first line 2: second line
  • 7.
    У Groovy классовесть метакласс //Добавляем/переопределяем метод/свойство для объекта Person p = new Person() p.metaClass.nickName = ‘John Doe’ p.metaClass.sayGoodBye << {println ‘Good bye!’} println p.getNickName() p.sayGoodBye() //Добавляем метод к классу Person.metaClass.printName = {println delegate.name} delegate – обращение к объекту Все объекты созданные до того, как метод был добавлен, не будут его иметь
  • 8.
    У Groovy естьAST трансформации //Что написали: @Cannonical Class Person { String firstName String lastName } Что получили: • Геттеры и Сеттеры • Конструкторы на все случаи жизни • С именными параметрами тоже • equals() • hashCode() • toString()
  • 9.
  • 10.