Groovy für Java Programmierer 20. Juli 2015 Stefan Kolatzki Übersicht • Karriere bei LINEAS • Groovy für Java Programmierer • Closures • Literale, Operatoren, Operatoren überladen • Extensions • Compilerverhalten erweitern • Domain Specific Languages • Live Demo Karriere bei LINEAS Wir über uns • 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 Kunden Karriere • • • • • • • • • 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 … Softwareentwickler Java Softwareentwickler C / C++ Softwareentwickler Grails / AngularJs Kontakt 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] Groovy für Java Programmierer „Groovy ist wie Java, nur ohne das Semikolon.“ Unbekannt ; Danke für ihre Aufmerksamkeit Groovy • • • • 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 Closures • • • 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 Zusätzliche Literale (Auswahl) • • 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 Operatoren (Auswahl) • N-te Potenz • • Elvis Operator • • • String value = user?.name Spread Operator • • String value = name ?: "John" // name ? name : "John" Safe Navigation • • int value = 2**3 // == 8 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> Operatoren überladen • 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 ... } Extensions • • • • 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) } Compilerverhalten erweitern • 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 Domain Specific Languages 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() } } Weiteres • • 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 … Live Demo Pros und Cons • • Pros • Weniger Code • Funktionale Programmierung • Schnellere Entwicklung • Flexibel Erweiterbar Cons • Fehleranfälliger durch dynamische Typisierung • Etwas langsamer als Java • Debugging von dynamischen Funktionsaufrufen schwierig Danke für ihre Aufmerksamkeit Quellen • Groovy • • • "Mazes for Programmers" • James Buck • The Pragmatic Programmers, LLC. 30.06.2015 Spock Framework • • http://spockframework.org The Grails Framework • • http://groovy-lang.org http://grails.org Gradle • https://gradle.org