Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy...

23
20. Juli 2015 Groovy für Java Programmierer Stefan Kolatzki

Transcript of Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy...

Page 1: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

20. Juli 2015

Groovy für Java Programmierer

Stefan Kolatzki

Page 2: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• Karriere bei LINEAS

• Groovy für Java Programmierer

• Closures

• Literale, Operatoren, Operatoren überladen

• Extensions

• Compilerverhalten erweitern

• Domain Specific Languages

• Live Demo

Übersicht

Page 3: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

Karriere bei LINEAS

Page 4: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• IT-Dienstleister und Software- und

Beratungshaus in Niedersachsen

• Standorte in Braunschweig und Wolfsburg

• ca. 100 Mitarbeiter

• hoher qualitativer Anspruch in allen

Bereichen mit maßgeschneiderten,

zukunftssicheren und integrierten Lösungen

• hochqualifizierte Mitarbeiter durch

kontinuierliche Weiterbildung und

Zertifizierung

• neueste Technologien um bestmögliche

Ergebnisse und hohen Kundennutzen zu

erzielen

Wir über uns

Page 5: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

Kunden

Page 6: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• Flache Hierarchien und ein familiäres

Arbeitsumfeld

• Individuelle Entwicklungsmöglichkeiten

• Regelmäßige Feedbackgespräche

• Unbefristete Arbeitsverträge

• Dienstwagenmodelle

• Fitnessstudiozuschüsse und Massagen

• Gemeinsame Betriebsfeiern und Events

• Montags frisches Obst, Freitags Süssigkeiten

• Kaffee, Tee, Wasser …

Karriere

Softwareentwickler Java

Softwareentwickler Grails / AngularJs

Softwareentwickler C / C++

Page 7: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

LINEAS Informationstechnik GmbH

Theodor-Heuss-Str. 2

38122 Braunschweig

Telefon +49 (531) 8852 0

Web: www.lineas.de

Victoria Mahler, Personalleiterin

+49 (531) 8852 - 1124

[email protected]

Kontakt

Page 8: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

Groovyfür Java Programmierer

Page 9: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

„Groovy ist wie Java,

nur ohne das

Semikolon.“

;

Unbekannt

Page 10: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

Danke für ihre

Aufmerksamkeit

Page 11: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• Dynamische Programmiersprache

• Dynamische Typisierung (def als dynamischer Typ)

• Typinferenz mit Flussanalysen (if(user instanceof User){...})

• Erweiterte Methodensuche beim Aufruf

• Aufruf von undefinierten Methoden

• JVM als Zielplattform

• Superset von Java (mit kleinen Einschränkungen)

• Funktionale Aspekte

• Funktionen höherer Ordnung

• Rekursion

• Typinferenz

• Operationen auf Listen

Groovy

Page 12: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• Funktion mit Zugriff auf den Erstellungskontext

• Als Funktion höherer Ordnung nutzbar

• Beispiel:

int value = 5

def cFun = { int add ->

return value + add

}

assert cFun(10)==15

Closures

Page 13: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• Listen / Mengen

• List<String> values = ["C++", "Java", "C#"]

• Set<String> values = ["C++", "Java", "C#"]

• Maps

• Map<String,Integer> values = ["C++":4, "Java":5, "C#": 3]

• Wertebereiche

• List<Integer> values = 5..9 //==[5,6,7,8,9]

• List<Integer> values = 5..<9 //==[5,6,7,8]

• Strings

• String javaString = 'Dies ist ein normaler Java String.'

• String interpolated = "String mit Werten: ${values}."

• String multiLine = """String über mehrere Zeilen."""

Zusätzliche Literale (Auswahl)

Page 14: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• N-te Potenz

• int value = 2**3 // == 8

• Elvis Operator

• String value = name ?: "John" // name ? name : "John"

• Safe Navigation

• String value = user?.name

• Spread Operator

• List<String> names = users*.getName()

• Spaceship

• int compare = 1 <=> 1 // == 0

• int compare = 'a' <=> 'z' // == -1

• Subscript

• User user = users[3] // user instanceof List<User>

Zusätzliche Operatoren (Auswahl)

Page 15: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• Mapping von Operatoren auf Funktionsnamen

class Complex{

Complex negative(){…}

Complex plus(final Complex value){…}

Complex minus(final Complex value){…}

...

}

void test(Complex a, Complex b){

Complex c = -a

Complex d = a + b

Complex e = b - d

...

}

Operatoren überladen

Page 16: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• Erweiterungen für existierende Klassen

• Statische und Instanzmethoden möglich

• Registrierung in META-INF Beschreibungsdatei

• Extensions in Groovy Runtime

• Collections

• collect()

• Streams

• …

• Beispiel:

static <T> T sample(final Collection<T> self) {

final int index = new Random().nextInt(self.size())

return (self as List).get(index)

}

Extensions

Page 17: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• Anpassen des Groovy Compileverhaltens per Annotationen

• Compile-Time Metaprogramming

• Eingebaute Umformungen in Groovy

• @groovy.transform.ToString

• @groovy.lang.Singleton

• @groovy.util.logging.Commons

• @groovy.transform.CompileStatic

• …

• Direkter Zugriff auf abstrakten Syntaxbaum

• Einordnung der Umwandlung zu Compilerphase

• Beispiel

• Spock DataDriven Testing

• Grails Domain-Klassen / Services

Compilerverhalten erweitern

Page 18: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

email {

from '[email protected]'

to '[email protected]

subject 'Hire me…'

body { p 'Hi there. I'am a …' }

}

Verwendet Methoden von

class EmailSpec {

void from(String from) { println "From: $from"}

void to(String... to) { println "To: $to"}

void subject(String subject) { println "Subject: $subject"}

void body(Closure body) {

def bodySpec = new BodySpec()

def code = body.rehydrate(bodySpec, this, this)

code.resolveStrategy = Closure.DELEGATE_ONLY

code()

}

}

Domain Specific Languages

Page 19: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• Traits (Interfaces mit Implementierungen)

• Standard Sichtbarkeit ist public

• Mischen von Groovy und Java Klassen

• Erweiterte Typumwandlung

• Typen müssen nicht zwingend Zuweisungskompatibel sein

• Coercion Operator (… as <TYPE>)

• list as Set

• 5 as String

• Feldzugriff über (generierte) Getter + Setter

• user.name übersetzt zu user.getName()

• Vergleichsoperator == verwendet equals Methode

• Methodenüberladungen mit Default-Werten

• Letzter Ausdruck einer Methode/Closure ist Rückgabewert

• …

Weiteres

Page 20: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

Live Demo

Page 21: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• Pros

• Weniger Code

• Funktionale Programmierung

• Schnellere Entwicklung

• Flexibel Erweiterbar

• Cons

• Fehleranfälliger durch dynamische Typisierung

• Etwas langsamer als Java

• Debugging von dynamischen Funktionsaufrufen schwierig

Pros und Cons

Page 22: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

Danke für ihre

Aufmerksamkeit

Page 23: Groovy für Java Programmierer - TU Braunschweig · 2016-10-28 · • Anpassen des Groovy Compileverhaltens per Annotationen • Compile-Time Metaprogramming • Eingebaute Umformungen

• Groovy

• http://groovy-lang.org

• "Mazes for Programmers"

• James Buck

• The Pragmatic Programmers, LLC. 30.06.2015

• Spock Framework

• http://spockframework.org

• The Grails Framework

• http://grails.org

• Gradle

• https://gradle.org

Quellen