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 personal@lineas.de
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 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>
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 'candidate@tu-bs.de' to 'personal@lineas.de 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 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