Tech Talk: Groovy

Preview:

DESCRIPTION

Kurze Einführung in Groovy

Citation preview

Folie 1Malte Wienecke

Tech Talk: Groovy26.02.2008

Malte Wienecke

Folie 2

Was ist Groovy?

Dynamische Programmier- und Skriptsprache für die Java-VM

Konzepte von Python, Ruby, Smalltalk

Durch hohe Integrationsmöglichkeiten mit Java

„Javas bester Freund“

Open-Source Projekt bei codehaus.org

Malte Wienecke

Folie 3

Eine Groovy Geschichte

2003 - Start durch James Strachan & Bob McWriter„Eleganz von Ruby in Java“

2004 - Beginn der StandardisierungJava Specification Requests – 241

2004 - GroovyOneGroovy Entwicklertreffen in London

Aktueller Projektleiter: Guillaume Laforge

Anfang 2007 - Release 1.0

Ende 2007 - Release 1.5

Malte Wienecke

Folie 4

Warum Javas bester Freund? (1)

… läuft in der Java Virtual Machine

… erweitert und nutzt die Bibliotheken des JDK

… kann auf Java-Klassen zugreifen

… kann von Java aufgerufen werden

… kann nach Java Classfiles compiliert werden

Groovy…

Malte Wienecke

Folie 5

Warum Javas bester Freund? (2)

andere

andere

andere

andere

Java friendly

Fea

ture

ric

h

(Quelle: „Groovy in Action“, D. Koenig)

Malte Wienecke

Folie 6

Was macht Groovy groovy? (1)

Einfache Syntax: Semikolon,Klammern bei Methodenaufruf,Typangaben,Exception-Deklaration optional

Closures

Einfache Notation für Ranges, Listen und HashMaps

„public“ ist default

Erweiterte switch-Anweisungen

Malte Wienecke

Folie 7

Was macht Groovy groovy? (2)

Alles ist ein Objekt

getter- und setter-Methoden werden automatisch erzeugt und beim Attribut-Zugriff automatisch genutzt

Operator-Overloading

Automatisch importierte Pakete:groovy.lang.*, groovy.util.*, java.lang.*, java.util.*, java.net.*, java.io.*, java.math.BigInteger, BigDecimal

Malte Wienecke

Folie 8

The Groovy way to say Hello (1)

public class SayHello {

public static void main (String[] args) {

System.out.println("hello");

}

}

Java kompatibel

Malte Wienecke

Folie 9

The Groovy way to say Hello (2)

class SayHello {

static void main (String[] args) {

System.out.println("hello");

}

}

public ist default

Malte Wienecke

Folie 10

The Groovy way to say Hello (3)

class SayHello {

static void main (args) {

System.out.println("hello")

}

}

Typangaben sind optional

Semikolon optional

Malte Wienecke

Folie 11

The Groovy way to say Hello (4)

class SayHello {

static void main (args) {

println("hello")

}

}

println kennt jeder Klasse

Malte Wienecke

Folie 12

The Groovy way to say Hello (5)

println("hello")

Keine Klassen für ausführbares Skript notwendig

Malte Wienecke

Folie 13

The Groovy way to say Hello (6)

println "hello"

Klammern meist optional bei Methodenaufrufen

Malte Wienecke

Folie 14

Die primitiven Datentypen (int, short byte, long, etc.) sind echte Groovy Objekte:

def i = 1

Gleichheit von Objekten wird mit dem Operator == abgefragtassert i == new Integer(1)

Identität von Objekten kann mit der Methode is() geprüft werden:def k = iassert i.is(k)assert !( i.is(new Integer(1)) )

Alles ist ein Objekt

Malte Wienecke

Folie 15

Closure

Einfache Closure:def c = { println 'hello' }c()

Closure mit Parameter:sqare = { f -> return f * f}assert sqare(5) == 25

alternativ:degree = { it * it }

Schleifen:5.times { println 'hello' }

oder:def sum = 01.upto(5) { sum += it }assert sum == 15

Malte Wienecke

Folie 16

Ranges, Lists & Maps

Wertebereiche als eigener Datentyp 5..10Beispiel:

sum = 0(1..10).each { sum += it }

(Array)Listen mit eigener NotationBeispiel:

def list = [1, 2, 3]list.each { sum += it }assert list << 9 == [1, 2, 3, 9]assert [1, 2, 3] - [2] == [1, 3]assert [1, 2] * 2 == [1, 2, 1, 2]

Direkte Notation für (Hash)MapsBeispiel:

def map = [a: 1, b: 2, c: 3]assert map.get('a') == 1assert map['a'] == 1assert map.a == 1

Malte Wienecke

Folie 17

Switch in Groovy

switch(v) {

// Zahlen

case 1: println 'Zahl 1'; break;

// String

case 'test': println 'String test'; break;

// Range

case 10..15: println 'In Range 1..15'; break;

// Auswahl aus Liste

case [1, '1', 'Eins']: println 'Irgenwie 1'; break;

// Regular Expression

case ~/Ein.*/: println 'Fängt mit Ein an'; break;

default: println 'Default-Zweig'; break

}

Malte Wienecke

Folie 18

Groovy Strings

GStrings erlauben Ausdrücke in Strings:def cal = new GregorianCalendar()println "Monat: ${cal.get(Calendar.MONTH)+1}"println "Datum: $cal.time"

GStrings über mehrere Zeilen:def gs = """Dieser GStringhat zwei Zeilen."""

Klassische Java Strings (mehrzeilig mit ''' '''):def s = 'Java String'

Strings für Regular Expressions (kein Escape für Backslash nötig): assert 'Alles nur Worte' ==~ /((\w*) *)*/ //Vollständigen Bereich prüfen assert 'Alles nur Worte' =~ /\w*/ // Auf einzelnen Treffer prüfen def matcher = 'Alles nur Worte' =~ /\w*/ // Alle Treffer ausgeben matcher.each { println it }

Malte Wienecke

Folie 19

Builder

Builder erlauben es, komplexe Datenstrukturen aufzubauen. (GOF Pattern)

Builder für:

Groovy-Objekte: NodeBuilder

XML, HTML: groovy.xml.MarkupBuilder

Swing: SwingBuilder

Ant: AntBuilder

Eigene Builder über BuilderSupport

Malte Wienecke

Folie 20

Builder (Beispiel)

XML

<tiere>

<tier>

<art text='Hund' />

</tier>

<tier>

<art text='Katze' />

</tier>

<tier>

<art text='Maus' />

</tier>

</tiere>

XML – Builder

def b = new groovy.xml.MarkupBuilder()

b.tiere {

for (n in ['Hund','Katze','Maus']){

tier {

art(text: n)

}

}

}

Malte Wienecke

Folie 21

XML Unterstützung in Groovy

Einfaches Einlesen durch eingebauten Xml-Parser

Zugriff auf XML-Daten durch GPath-Ausdrücke

Erzeugen von XML durch XML-Builder

Groovy als Alternative zu XSLT

Malte Wienecke

Folie 22

XML-Parser (Beispiel)

XML

<tiere>

<tier>

<art text='Hund' />

</tier>

<tier>

<art text='Katze' />

</tier>

<tier>

<art text='Maus' />

</tier>

</tiere>

XML – Parser

def t = new XmlParser().parseText(xml)

// GPath auf das Object-Netz

assert t.tier.art.'@text' ==

['Hund', 'Katze', 'Maus']

Malte Wienecke

Folie 23

Tolle andere Features von Groovy

Unterstützung von JUnit

Unterstützung von Datenbanken

Unterstützung für XML

Malte Wienecke

Folie 24

Fleisch und Knochen

Aufteilung von Systemen in

Java:Statische, stabile Komponenten,Laufzeit-kritisch(Knochen)

Groovy:Dynamische, flexible Komponenten,hohe Anpaßbarkeit(Fleisch)

Malte Wienecke

Folie 25

Quellen

Wikipedia:http://de.wikipedia.org/wiki/Groovy

Vortrag von Christof Vollrath beim23rd Chaos Communication Congress, Dezember 2006

http://events.ccc.de/congress/2006/Fahrplan/events/1419.en.html

Malte Wienecke

Folie 26

Recommended