Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Peter Niederwieser on Groovy

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

Peter Niederwieser on Groovy

More Decks by Enterprise Java User Group Austria

Other Decks in Technology

Transcript

  1. Über mich • Chief Engineer bei Smarter Ecommerce GmbH •

    Programming language & chocolate addict • Groovy, Scala, Clojure, (Java) • Lindt Dunkel 75% • Groovy Committer • Autor des Spock Frameworks
  2. Was ist Groovy? • Programmiersprache für die JVM • Leichtgewichtige

    Alternative/Ergänzung zu Java • Dynamisch typisiert • Ausdrucksstark • Flexible Syntax • “Programs are written by programmers for programmers” • “Make simple things easy, and difficult things possible”
  3. Getting Started 1. (Java 5 installieren) 2. Groovy Distribution herunterladen

    http://groovy.codehaus.org/Download 3. GROOVY_HOME auf entpacktes Verzeichnis setzen 4. GROOVY_HOME/bin zum Pfad hinzufuegen 5. >groovyConsole(.bat) • Noch einfacher: Windows Installer • Noch einfacher: Groovy Web Console http://groovyconsole.appspot.com/
  4. HelloWorld.java public class HelloWorld { private String name; public String

    getName() { return name; } public void setName(String name) { this.name = name; } public String greet() { return "Hello " + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } }
  5. HelloWorld.groovy > mv HelloWorld.java HelloWorld.groovy > groovy HelloWorld.groovy • Gültiger

    Java-Code ist fast immer gültiger Groovy-Code • Wer Java kennt, kennt Groovy!
  6. HelloWorld.groovy Optionale Syntax public class HelloWorld { private String name;

    public String getName() { return name; } public void setName(String name) { this.name = name; } public String greet() { return "Hello " + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } }
  7. HelloWorld.groovy Optionale Syntax class HelloWorld { private String name String

    getName() { name } void setName(String name) { this.name = name } String greet() { "Hello " + name } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.setName "Groovy" System.out.println helloWorld.greet() } }
  8. HelloWorld.groovy Properties class HelloWorld { private String name String getName()

    { name } void setName(String name) { this.name = name } String greet() { "Hello " + name } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.setName "Groovy" System.out.println helloWorld.greet() } }
  9. HelloWorld.groovy Properties class HelloWorld { String name String greet() {

    "Hello " + name } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.name = "Groovy" System.out.println helloWorld.greet() } }
  10. HelloWorld.groovy Dynamische Typisierung class HelloWorld { String name String greet()

    { "Hello " + name } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.name = "Groovy" System.out.println helloWorld.greet() } }
  11. HelloWorld.groovy Dynamische Typisierung class HelloWorld { def name def greet()

    { "Hello " + name } static main(args) { def helloWorld = new HelloWorld() helloWorld.name = "Groovy" System.out.println helloWorld.greet() } }
  12. HelloWorld.groovy String-Interpolation Haeufig verwendete Funktionen class HelloWorld { def name

    def greet() { "Hello " + name } static main(args) { def helloWorld = new HelloWorld() helloWorld.name = "Groovy" System.out.println helloWorld.greet() } }
  13. HelloWorld.groovy String-Interpolation Haeufig verwendete Funktionen class HelloWorld { def name

    def greet() { "Hello $name" } static main(args) { def helloWorld = new HelloWorld() helloWorld.name = "Groovy" println helloWorld.greet() } }
  14. HelloWorld.groovy Namensparameter Automatisch erzeugter Konstruktor class HelloWorld { def name

    def greet() { "Hello $name" } static main(args) { def helloWorld = new HelloWorld() helloWorld.name = "Groovy" println helloWorld.greet() } }
  15. HelloWorld.groovy Namensparameter Automatisch erzeugter Konstruktor class HelloWorld { def name

    def greet() { "Hello $name" } static main(args) { def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet() } }
  16. HelloWorld.groovy Skripts class HelloWorld { def name def greet() {

    "Hello $name" } static main(args) { def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet() } }
  17. HelloWorld.groovy Skripts class HelloWorld { def name def greet() {

    "Hello $name" } } def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet()
  18. HelloWorld.groovy Vorher/Nachher public class HelloWorld { private String name; public

    String getName() { return name; } public void setName(String name) { this.name = name; } public String greet() { return "Hello" + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } } class HelloWorld { def name def greet() { "Hello $name" } } def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet()
  19. Java vs. Groovy • Gültiger Java-Code ist (fast immer) gültiger

    Groovy-Code • Groovy unterstützt Annotations, Generics, Enums, Varargs, usw. • Java-Klasse ist Groovy-Klasse und umgekehrt • Können sich gegenseitig rufen, voneinander ableiten, zirkuläre Abhängigkeiten haben • Groovy erweitert die Java-Standardbibliothek
  20. Neue Sprachelemente Literale • Listen [] [1, 2, 3] •

    Ranges (0..3) (‘a’..’z’) • Maps [:] [peter: “groovy”, juergen: “spring”] • BigDecimals 3.141592654 • Reguläre Ausdrücke /\+d/
  21. Neue Sprachelemente Default-Werte für Parameter Namensparameter class Person { String

    name String city int age def sing(song = “let it be”) { ... } } def person = new Person(name:”peter”, city: “linz”, age: 33) person.sing() person.sing(“yellow submarine”)
  22. Neue Sprachelemente Operator Overloading Power Asserts class Person { int

    age def plus(other) { new Person(age: age + other.age) } String toString() { "I'm $age years old" } } def person1 = new Person(age: 11) def person2 = new Person(age:22) def mixedPerson = person1 + person2 assert mixedPerson.age == 33
  23. Neue Sprachelemente Closures • Wiederverwendbare Code-Blöcke • Bekannt aus JavaScript,

    Ruby, ... (Java 7?) • Ersetzen oft anonyme innere Klassen kürzer, flexibler, mächtiger • Wirken sich auf Design von Bibliotheken aus
  24. Neue Sprachelemente Closures def greet = { name -> println

    “Hello $name” } greet(“Groovy”) def greet = { println “Hello $it” } def greet2 = greet greet2(“Groovy”) def listener = { event -> /* handle event */ } as ActionListener
  25. Neue Sprachelemente Iteratoren • Iteratoren für viele Standardtypen Collections Ranges

    Strings Pattern Matches Dateien ... • Groovy macht das “Richtige”
  26. Neue Sprachelemente Iteratoren [1,2,3].each { println it } (1..3).each {

    println it} for (x in [1,2,3]) println x for (x in 1..3) println x for (ch in "hagenberg") println ch
  27. Neue Sprachelemente GPath • Navigation durch Objekt-Graphen • Ähnlich wie

    XPath, aber für beliebige Objekte • Wichtige Bestandteile: ?. *. Property-Notation
  28. Neue Sprachelemente GPath class Person { def name; def age;

    def hobby } def persons = [] persons << new Person(name: "peter", age: 33, hobby: "groovy") persons << new Person(name:"chris", age:28) assert persons.age == [33, 28] assert persons*.getName() == ["peter", "chris"] assert persons[2]?.name == null assert persons[0].hobby ?: "no hobbies" == "groovy" assert persons[1].hobby ?: "no hobbies"== "no hobbies"
  29. Standardbibliothek • Groovy erweitert Java Klassen um viele neue Methoden

    • Volle Kompatibilität zu Java bleibt erhalten! • Zusätzlich neue APIs, die das Leben erleichtern • XML Parsing • Datenbankzugriff • HTML Generierung • und vieles mehr...
  30. Standardbibliothek Neue Methoden für Java Collection API def list =

    [1,2,3] assert list instanceof ArrayList assert list.min() == 1 assert list.max() == 3 assert list.collect { it**2 } == [1, 4, 9] assert list.grep { it > 1 } == [2, 3] • Viele weitere Erweiterungen des Java APIs, deklariert in Klasse DefaultGroovyMethods
  31. Standardbibliothek Unveränderbare Objekte, Java Version public class Person { private

    final String first; private final String last; public String getFirst() { return first; } public String getLast() { return last; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (first == null) { if (other.first != null) return false; } else if (!first.equals(other.first)) return false; if (last == null) { if (other.last != null) return false; } else if (!last.equals(other.last)) return false; return true; } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((first == null) ? 0 : first.hashCode()); result = prime * result + ((last == null) ? 0 : last.hashCode()); return result; } @Override public String toString() { return "Person(first:" + first + ", last:" + last + ")"; } }
  32. Standardbibliothek MarkupBuilder import groovy.xml.* def page = new MarkupBuilder() page.html

    { head { title ‘Hello’ } body { ul { for (count in 1..5) { li “world $count” } } } } <html> <head> <title>Hello</title> </head> <body> <ul> <li>world 1</li> <li>world 2</li> <li>world 3</li> <li>world 4</li> <li>world 5</li> </ul> </body> </html>
  33. Metaprogrammierung Fehlende Methoden fangen class Person { def methodMissing(String name,

    Object args) { println name } } def person = new Person() person.doYouUnderStandMe()
  34. Metaprogrammierung ExpandoMetaClass List.metaClass.firstElement { -> delegate[0] } def list =

    [1,2,3] assert list instanceof ArrayList assert list.firstElement() == 1 • Groovy APIs (z.B. Builders) verwendet oft diesen und andere Metaprogrammierungs-Tricks
  35. Kompilieren und Ausführen • Kommandozeile groovy, groovyc, groovysh • Groovy

    (Web) Console • Build Tools Ant, Maven, Gradle • IDEs IDEA, Eclipse, NetBeans
  36. Einsatzmöglichkeiten • Entwicklung kompletter Anwendungen • Shell-Skripting • Erweitern bestehender

    Anwendungen um Skriptbarkeit • Entwicklung von Web- und Desktop-Anwendungen (Grails, Gaelyk, Griffon, ...) • Als Buildwerkzeug (Gant, Gradle, ...) • Zum Testen von Groovy und Java Code (easyB, GMock, Spock) • Beispiele: SmecoScript und Spock
  37. Einsatzmöglichkeiten Spock Framework • Test-Framework im Stil von JUnit •

    Geeignet für alle Arten von Entwickler-Tests • Erleichtert Testen von Groovy und Java Code • Einige Highlights: Sprechende Test-Namen Power Asserts Data-driven Tests Eingebautes Mock-Framework Einfach erweiterbar Plugins fuer Guice, Spring, Unitils, Grails, ...
  38. Buchempfehlung & Links • Dirk König et al: Groovy in

    Action (2nd Ed) • Groovy http://groovy.codehaus.org • Grails http://grails.org • Gradle http://gradle.org • Spock http://spockframework.org • Smarter Ecommerce GmbH http://smarter-ecommerce.com
  39. Quellen • Paul King: Groovy Tutorial http://www.slideshare.net/paulk_asert/groovy-tutorial • Andres Almiray:

    Introduction to Groovy http://www.slideshare.net/aalmiray/redev-09-introduction-to-groovy