Scala – Objektfunktionale Programmierung

Werbung
oliver BRAUN
SCALA
OBJEKTFUNKTIONALE PROGRAMMIERUNG
Inhaltsverzeichnis
Vorwort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
XI
1
Einführung . . . . . . . . . . . . . . . . . . . . . . .
1.1 Was Führungskräfte über Scala wissen sollten
1.2 Java-Scala-Integration . . . . . . . . . . . . . .
1.3 Über dieses Buch . . . . . . . . . . . . . . . . .
1.4 Typographische und sonstige Konventionen .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
3
4
5
6
2
Einrichten der Arbeitsumgebung . . . . . .
2.1 Die Scala-Shell und die Kommandozeile
2.1.1 Der Scala-Interpreter . . . . . . .
2.1.2 Die Scala-(De-)Compiler . . . . .
2.1.3 Der Dokumentationsgenerator .
2.2 Buildtools . . . . . . . . . . . . . . . . .
2.2.1 Das Maven-Scala-Plugin . . . . .
2.2.2 Simple Build Tool . . . . . . . . .
2.3 IDE-Support . . . . . . . . . . . . . . . .
2.3.1 Eclipse . . . . . . . . . . . . . . .
2.3.2 NetBeans . . . . . . . . . . . . . .
2.3.3 IntelliJ IDEA . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
11
13
16
17
17
19
22
22
23
24
3
Grundlagen . . . . . . . . . . . . .
3.1 Ein kleines bisschen Syntax .
3.2 Imperative Programmierung
3.3 Ein ausführbares Programm .
3.4 Annotations . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
27
27
39
42
44
4
Reine Objektorientierung . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1 Klassen und Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
47
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
VIII
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
47
60
62
65
67
73
78
78
79
80
82
83
88
95
Funktionales Programmieren . . . . . . . . . . . . . . . . .
5.1 Lazy Evaluation . . . . . . . . . . . . . . . . . . . . . .
5.2 Funktionen und Rekursionen . . . . . . . . . . . . . .
5.3 Higher-Order-Functions . . . . . . . . . . . . . . . . .
5.4 Case-Klassen und Pattern Matching . . . . . . . . . .
5.4.1 Case-Klassen . . . . . . . . . . . . . . . . . . .
5.4.2 Versiegelte Klassen . . . . . . . . . . . . . . . .
5.4.3 Partielle Funktionen . . . . . . . . . . . . . . .
5.4.4 Variablennamen für (Teil-)Pattern . . . . . . .
5.4.5 Exception Handling . . . . . . . . . . . . . . .
5.4.6 Extraktoren . . . . . . . . . . . . . . . . . . . .
5.4.7 Pattern Matching mit regulären Ausdrücken .
5.5 Currysierung und eigene Kontrollstrukturen . . . . .
5.6 For-Expressions . . . . . . . . . . . . . . . . . . . . . .
5.7 Typsystem . . . . . . . . . . . . . . . . . . . . . . . . .
5.7.1 Standardtypen . . . . . . . . . . . . . . . . . .
5.7.2 Parametrischer Polymorphismus und Varianz
5.7.3 Upper und Lower Bounds . . . . . . . . . . . .
5.7.4 Views und View Bounds . . . . . . . . . . . . .
5.7.5 Context Bounds . . . . . . . . . . . . . . . . . .
5.7.6 Arrays und @specialized . . . . . . . . . . . .
5.7.7 Generalized Type Constraints . . . . . . . . . .
5.7.8 Self-Type-Annotation . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
101
102
104
108
114
119
122
124
126
126
128
130
132
141
147
147
148
151
154
155
155
158
160
4.2
4.3
4.4
5
Inhaltsverzeichnis
4.1.1 Felder und Methoden . . . . . . . . . . .
4.1.2 Was Klassen sonst noch enthalten können
4.1.3 Konstruktoren . . . . . . . . . . . . . . . .
4.1.4 Enumerations . . . . . . . . . . . . . . . .
4.1.5 Vererbung und Subtyping . . . . . . . . .
4.1.6 Abstrakte Klassen . . . . . . . . . . . . .
Codeorganisation . . . . . . . . . . . . . . . . . .
4.2.1 Packages . . . . . . . . . . . . . . . . . . .
4.2.2 Package Objects . . . . . . . . . . . . . . .
4.2.3 Importe . . . . . . . . . . . . . . . . . . .
Traits . . . . . . . . . . . . . . . . . . . . . . . . .
4.3.1 Rich Interfaces . . . . . . . . . . . . . . .
4.3.2 Stapelbare Modifikationen . . . . . . . . .
Implicits und Rich-Wrapper . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Inhaltsverzeichnis
5.7.9
IX
Strukturelle und existenzielle Typen . . . . . . . . . . . . . . 162
6
Die Scala-Standardbibliothek . . . . .
6.1 Überblick und das Predef-Objekt
6.2 Das Collection-Framework . . . . .
6.3 Scala und XML . . . . . . . . . . .
6.4 Parser kombinieren . . . . . . . . .
6.5 Ein kleines bisschen GUI . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
165
165
170
176
180
187
7
Actors – Concurrency und Multicore-Programmierung .
7.1 Ein Thread ist ein Actor . . . . . . . . . . . . . . . .
7.2 Empfangen und Reagieren . . . . . . . . . . . . . . .
7.3 Dämonen und Reaktoren . . . . . . . . . . . . . . . .
7.4 Scheduler . . . . . . . . . . . . . . . . . . . . . . . . .
7.5 Remote Actors . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
193
194
196
207
209
211
8
Softwarequalität – Dokumentieren und Testen . . . . . .
8.1 Scaladoc . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2 ScalaCheck . . . . . . . . . . . . . . . . . . . . . . . . .
8.2.1 Grundlagen . . . . . . . . . . . . . . . . . . . .
8.2.2 Generatoren . . . . . . . . . . . . . . . . . . . .
8.2.3 Automatisiertes Testen mit Sbt . . . . . . . . .
8.3 ScalaTest . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3.1 ScalaTest und JUnit . . . . . . . . . . . . . . . .
8.3.2 ScalaTest und TestNG . . . . . . . . . . . . . .
8.3.3 ScalaTest und BDD . . . . . . . . . . . . . . . .
8.3.4 Funktionale, Integrations- und Akzeptanztests
8.3.5 Die FunSuite . . . . . . . . . . . . . . . . . . .
8.4 Specs . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.4.1 Eine Specs-Spezifikation . . . . . . . . . . . . .
8.4.2 Matchers . . . . . . . . . . . . . . . . . . . . . .
8.4.3 Mocks mit Mockito . . . . . . . . . . . . . . . .
8.4.4 Literate Specifications . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
215
216
221
221
224
229
232
233
235
236
238
240
241
242
244
248
249
9
Webprogrammierung mit Lift . . . . . .
9.1 Quickstart mit Lift . . . . . . . . . .
9.2 Bootstrapping . . . . . . . . . . . . .
9.3 Rendering – Templates und Snippets
9.4 Benutzerverwaltung und SiteMap .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
253
254
257
262
264
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
X
Inhaltsverzeichnis
9.5
9.6
Persistenz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Implementierung der Snippets . . . . . . . . . . . . . . . . . . . . . 269
10 Leichtgewichtige Webprogrammierung mit Scalatra . . . . . . . . . . . 279
10.1 Quickstart mit Scalatra . . . . . . . . . . . . . . . . . . . . . . . . . . 279
10.2 Der Final-Grade-Calculator . . . . . . . . . . . . . . . . . . . . . . . 281
11 Akka – Actors und Software Transactional Memory
11.1 Quickstart mit Akka . . . . . . . . . . . . . . . .
11.2 Der MovieStore . . . . . . . . . . . . . . . . . . .
11.3 User- und Session-Management . . . . . . . . . .
11.4 Software Transactional Memory . . . . . . . . . .
11.5 Client und Service . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
287
288
289
293
297
300
Schlusswort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Kapitel 1
Einführung
Schon wieder eine neue Programmiersprache, obwohl: Scala ist gar nicht mehr so
neu. Die Entwicklung begann 2001 an der École polytechnique fédérale de Lausanne (EPFL) in der Schweiz von einem Team um Professor Martin Odersky. Das
erste Release wurde bereits 2003 veröffentlicht. 2006 folgte die Version 2.0 und
2010, gerade während dieses Buch geschrieben wird, wird die Version 2.8 freigegeben, die laut Odersky eigentlich 3.01 heißen müsste.
Professor Odersky ist in der Java-Welt kein Unbekannter. 1995 begann er mit Philip Wadler2 mit der Entwicklung der funktionalen Programmiersprache Pizza3 ,
die sich in Bytecode für die Java Virtual Machine (JVM) übersetzen lässt. Diese
Arbeit führte über GJ4 schließlich zum neuen javac-Compiler und den mit Java
5 eingeführten Java Generics5 .
Als Odersky 1999 an die EPFL kam, verschob er seinen Fokus etwas. Er hatte
immer noch das Ziel, die objektorientierte und funktionale Programmierung zu
verbinden, wollte sich aber nicht mehr mit den Restriktionen von Java belasten.
Nach der Entwicklung der Programmiersprache Funnel6 nahm er als weitere Ziele
die praktische Verwendbarkeit und die Interoperabilität mit Standardplattformen
hinzu und entwarf Scala7 .
Scala ist eine Hybrid-Sprache, die auf einzigartige Weise Features von objektorientierten und funktionalen Programmiersprachen verbindet. Designziel von Scala
1
Eigentlich sollte nur das Collection-Framework (siehe Abschnitt 6.2) einem Redesign unterworfen
werden. Die Arbeiten daran dauerten aber etwa 18 Monate, sodass parallel dazu eine Vielzahl anderer Features entstanden, die in die bereits angekündigte Version 2.8 aufgenommen wurden. Von der
bereits kommunizierten Versionsnummer wollte das Scala-Team nicht mehr abweichen.
2 http://homepages.inf.ed.ac.uk/wadler/
3 siehe [OW97] und http://pizzacompiler.sourceforge.net/
4 siehe [BOSW98] und http://lamp.epfl.ch/pizza/gj/
5 siehe [NW06]
6 siehe [Ode00] und http://lampwww.epfl.ch/funnel/
7 siehe [Ode10b] und http://www.scala-lang.org/
2
1 Einführung
ist eine knappe, elegante und typsichere Programmierung. Scala wird nicht nur in
Bytecode für die JVM kompiliert, es lässt sich auch jeglicher Java-Code direkt aus
Scala heraus nutzen und umgekehrt.
Scala ist eine rein objektorientierte Programmiersprache. Das heißt, in Scala ist jeder Wert ein Objekt. Scala nutzt ein Konzept von Klassen und Traits. Mit Traits
lassen sich Rich-Interfaces realisieren, denn Traits können bereits konkrete Implementierungen enthalten. Klassen werden durch Vererbung erweitert, Traits werden in eine Klasse oder in ein Objekt hineingemixt. Um nicht in typische Probleme
mit Mehrfachvererbung zu laufen, werden Traits linearisiert.
Ob Scala sich funktionale Programmiersprache nennen darf, wurde im Web kürzlich erst ausführlich diskutiert. Odersky bezeichnet Scala schließlich in [Ode10a]
als postfunktionale Sprache. Fest steht auf alle Fälle, dass Scala über eine Reihe
von Features verfügt, die entweder der funktionalen Programmierung zuzurechnen sind oder aus ihrem Umfeld entstammen.
In Scala ist jede Funktion ein Wert8 und kann gleichberechtigt mit anderen Werten behandelt werden. Das bedeutet beispielsweise, eine Funktion kann Argument oder Ergebnis einer anderen Funktion9 sein, Funktionen können in Listen
gespeichert werden, und Funktionen können ineinander verschachtelt werden.
Darüber hinaus unterstützt Scala auch Features wie Pattern Matching10 und Currysierung11 .
Im Gegensatz zu vielen modernen und angesagten Programmiersprachen ist Scala statisch typisiert. Das heißt, der Typ aller Ausdrücke wird zur Kompilierzeit
überprüft und nicht erst zur Laufzeit, wie es bei dynamisch typisierten Sprachen
der Fall ist. Nachdem eine überwiegende Anzahl von Programmierfehlern Typfehler sind, ist die statische Typisierung unserer Ansicht nach im allgemeinen vorzuziehen. Dem wesentlichen Nachteil, nämlich der Notwendigkeit, überall Typen
angeben zu müssen, wird in Scala mit einem Typinferenzmechanismus begegnet. Damit ist es an den meisten Stellen nicht notwendig Typen anzugeben. Beim
Übersetzen wird der Typ dann inferiert und überprüft, ob alles zusammenpasst.
Scala hat ein sehr ausgefeiltes Typsystem, das neben generischen Klassen und
polymorphen Methoden auch Varianz-Annotationen, Upper und Lower Bounds
und vieles mehr zur Verfügung stellt.
Ein weiteres Merkmal von Scala, was übrigens für Scalable Language steht, ist
die einfache Erweiterbarkeit. Damit ist Scala prädestiniert zur Erstellung von Domain Specific Languages (DSLs). Zu guter Letzt kann Scala auch noch mit Unterstützung für die .NET-Plattform aufwarten. Dabei handelt es sich allerdings noch
nicht um einen Stand, der als „production ready” zu bezeichnen ist.
8
und damit ein Objekt
Funktionen, die eine Funktion als Argument oder Ergebnis haben, heißen Higher Order Functions,
zu deutsch: Funktionen höherer Ordnung.
10 siehe Abschnitt 5.4
11 siehe Abschnitt 5.5
9
1.1 Was Führungskräfte über Scala wissen sollten
3
Scala auf der JVM ist seit Langem ausgewachsen und kann in allen Situationen,
auch unternehmenskritisch, eingesetzt werden. Die Weiterentwicklung von Scala
ist sehr aktiv, von Bugfix-Releases über neue Features wird uns in der nächsten
Zeit noch einiges erwarten. Für die kommenden Jahre steht der Fokus des ScalaTeams auf der noch besseren Unterstützung von Multicore-Architekturen.
1.1
Was Führungskräfte über Scala wissen sollten
Scala ist eine erwachsene, sehr durchdachte Programmiersprache. Mit Scala können Sie uneingeschränkt alles machen, was mit Java auch gemacht werden kann.
Nachdem Scala in Bytecode für die JVM kompiliert wird, also in Java-Bytecode,
können Sie den einmal erstellten Scala-Code natürlich auch aus Java heraus nutzen. Zusammenfassend heißt das: Scala kann gefahrlos ausprobiert werden. Selbst
wenn zu Java zurückgewechselt werden sollte, ist die Arbeit in Scala nicht umsonst. Und die gesamte Werkzeugpalette, die für die Java-Entwicklung genutzt
wird, wie z.B. Eclipse, NetBeans oder Maven, wird zur Entwicklung von ScalaCode einfach weiter benutzt.
Warum aber sollten Sie überhaupt zu Scala wechseln? Scala erhöht die Produktivität! Scala bietet eine Vielzahl von Features, mit denen Sie kürzeren und eleganteren Code schreiben können. Sicherlich ist die bloße Anzahl von Lines of Code
nicht sehr aussagekräftig, aber mit weniger Code gibt es mindestens statistisch
gesehen auch weniger Fehler. Scala ist strenger typisiert als Java. Auch dadurch
schlupfen weniger Fehler durch. Und ein wesentlicher Vorteil beim Start mit Scala ist, dass es sich fast wie Java anfühlt und zusätzliche Features nach und nach
eingeflochten werden können.
Warum denn Scala und nicht eine der unzähligen anderen Sprachen? Dazu möchten wir nur einige Zitate wiedergeben:
„If I were to pick a language to use today other than Java, it would be Scala.”
James Gosling, Schöpfer von Java
„Scala, it must be stated, is the current heir apparent to the Java throne. No other
language on the JVM seems as capable of being a “replacement for Java” as Scala, and the momentum behind Scala is now unquestionable. While Scala is not a
dynamic language, it has many of the characteristics of popular dynamic languages, through its rich and flexible type system, its sparse and clean syntax, and its
marriage of functional and object paradigms.”
Charles Nutter, Schöpfer von JRuby
„Though my tip though for the long term replacement of javac is Scala. I’m very
impressed with it! I can honestly say if someone had shown me the Programming
4
1 Einführung
in Scala book by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I’d
probably have never created Groovy.”
James Strachan, Schöpfer von Groovy
Wer nutzt Scala noch? Scala ist mittlerweile in einer Reihe von Firmen wie Sony,
Siemens und Xerox angekommen. Betrachten wir beispielhaft zwei Erfolgsgeschichten:
1. Électricité de France Trading (EDFT) ist eine Tochterfirma von Frankreichs
größter Energiefirma EDF, die sich mit dem Energiemarkt befasst. In den letzten Jahren hat EDFT einen substanziellen Teil der 300.000 Zeilen Java-Code
für „Trading and Pricing” erfolgreich durch Scala ersetzt. EDFT spricht von einer signifikanten Steigerung der Produktivität und von sehr viel verbesserten
Schnittstellen für ihre Händler. Der Teamleiter Alex McGuire hat mittlerweile EDFT verlassen und eine eigene Firma gegründet, die Scala-Consulting für
Finanzdienstleister und Handelsunternehmen bietet.
2. Twitter12 bietet einen sehr populären Realtime-Messaging-Service, den weltweit über 70 Millionen User nutzen. Pro Tag verarbeitet die Twitter-Infrastruktur, die mittlerweile im Backend zum Großteil aus Scala-Code besteht, über 50
Millionen Kurznachrichten, sogenannte Tweets.
Und was ist mit kommerziellem Support? Den gibt es bereits in verschiedenster
Form. Es gibt eine sehr aktive Scala-Community und erste, auch deutsche, Firmen,
die Scala-Consulting leisten. Ein wesentlicher Schritt war die Gründung der Firma ScalaSolutions durch Martin Odersky selbst. Die Firma bietet Scala-Support,
-Consulting und -Training an. Und nicht zuletzt damit können interessierte und
gute Java-Programmierer innerhalb kürzester Zeit zu guten Scala-Entwicklern geschult werden.
1.2
Java-Scala-Integration
Auch wenn Sie Scala noch nicht kennengelernt haben, wollen wir an dieser Stelle
zur weiteren Motivation bereits etwas über die nahtlose Integration mit Java sagen. Aus Scala heraus können Sie Java-Klassen und -bibliotheken genauso nutzen,
wie Sie das direkt in Java machen würden13 .
Umgekehrt geht das fast genauso einfach. Nur an ein paar kleinen Stellen müssen Sie ein bisschen mehr über die Interna wissen. Scala ist, was Sprachfeatures
angeht, mächtiger als Java. Alle Features werden aber durch Java-Bytecode repräsentiert. Daher kommen wir von Java aus überall heran, die Frage ist nur wie.
12
http://twitter.com/
Eine kleine Besonderheit stellen Javas Wildcard und Raw Types dar. Auch dafür gibt es in Scala eine
Lösung, aber die würde an dieser Stelle etwas zu weit führen. Die Lösung, existenzielle Typen, werden
wir in Abschnitt 5.7.9 besprechen.
13
1.3 Über dieses Buch
5
In Scala ist im Gegensatz zu Java alles ein Objekt. Zur besseren Performanz werden die Objekte, die in Java als primitive Typen repräsentiert werden, wenn möglich in einen primitiven Wert umgewandelt, z.B. der Scala Int in den Java int.
Ist dies nicht möglich, z.B. weil in Java primitive Datentypen nicht als Typparameter für generische Klassen zulässig sind, wird der Wert in die entsprechende
Wrapper-Instanz umgewandelt. Beispielsweise wird der Scala Int in einer Liste
in eine Instanz der Klasse java.lang.Integer übersetzt.
Scalas reine Objektorientierung lässt keine statischen Klassenmember zu. Stattdessen hat Scala Singleton-Objekte. Aus einem Singleton-Objekt mit dem Namen
MyObject wird eine Klasse mit dem Namen MyObject$ erzeugt, die das Objekt
über das statische Feld MODULE$ nutzbar macht.
Wenn es zum Singleton-Objekt keine dazugehörige Klasse gibt, es sich also um
ein sogenanntes Standalone-Objekt handelt, wird darüber hinaus noch eine Klasse mit dem Namen MyObject erzeugt, die statische Member für alle Member
des Scala-Objekts enthält. Damit wird dann auf das Member x des Scala-Objekts
MyObject in Scala wie auch in Java mit MyObject.x zugegriffen.
Mit Scalas Traits ist es ein bisschen komplizierter, da Java kein entsprechendes
Konstrukt kennt. Aus einem Trait wird immer ein Java-Interface und damit ein
Typ erzeugt. Über Variablen dieses Typs können alle Methoden der Scala-Objekte
genutzt werden. Das Implementieren eines Traits in Java ist allerdings nicht praktikabel, außer der Trait enthält nur abstrakte Member.
Javas Annotations und Exceptions werden von Scala unterstützt. Spezielle ScalaAnnotations wie zum Beispiel @volatile, @transient und @serializable
werden in die entsprechenden Java-Konstrukte transformiert. Scala kennt keine Checked Exceptions, bietet aber eine @throws-Annotation für die JavaInteroperabilität.
1.3
Über dieses Buch
Mit dem vorliegenden Buch wollen wir Sie in die faszinierende Welt von Scala entführen. Um Ihnen den Einstieg so angenehm wie möglich zu machen und
damit Sie das von uns Beschriebene gleich praktisch ausprobieren können, beginnen wir in Kapitel 2 mit Informationen über die Scala-Tools und über die Tools
zur Unterstützung des Entwicklungsprozesses.
Anschließend befassen wir uns in drei Kapiteln mit der Programmiersprache Scala. In Kapitel 3 tasten wir uns an die Syntax heran und besprechen die imperativen Programmierkonzepte. Außerdem zeigen wir Ihnen, wie in Scala ausführbare
Scripts entwickelt werden, und erstellen ein erstes kompilierbares Programm.
Auch wenn sich die Features von Scala nicht streng in Merkmale objektorientierter
und funktionaler Programmiersprachen aufteilen lassen, haben wir eine solche
Aufteilung in die beiden Kapitel 4 und 5 vorgenommen. Dabei findet sich alles,
Stichwortverzeichnis
Actor
! 197
Act 196
DaemonActor 207
Reactor 208
RemoteActor 211
ReplyReactor 208
TIMEOUT 198
actor 194
alive 211
loopWhile 205
loop 205
reactWithin 203
react 203
receiveWithin 198
receive 197
register 211
remoteActor 212
self 197
Scheduler 209
Annotation 44
deprecated 44
serializable 44
spezialized 157
tailrec 107
throws 128
transient 44
unchecked 44, 124
volatile 44
Self-Type 160
Varianz-Annotation 150
Argument
Default 36
Named 36
Array 29
args 40
Bedarfsauswertung 102
Bezeichner 31
Call-by-Name 140
Call-by-Value 139
Closure 104
Collections 170
Context Bound 155
Currysierung 132
dynamisches Binden 72
Eclipse 22
Enumeration 65
Evaluation
Eager 102
Lazy 102
Exception Handling 126
Extraktor 128
Feld 47
Filter 142
For-Comprehension 141
For-Expression 141
Funktion 35, 104
dropWhile 112
exists 112
312
filterNot 112
filter 112
flatMap 144
foldLeft 112
foldRight 112
forall 112
foreach 111
map 110
parseAll 183
partition 112
reduceLeft 113
reduceRight 113
scanLeft 113
scanRight 113
span 112
takeWhile 112
Angabe des Ergebnistyps notwendig 36
Closure 104
endrekursiv 106
höherer Ordnung 108
ineinander verschachtelte 37
Literal 104
Parameterliste 35
partiell angewendete 110
partielle 124
rekursive 104
tail recursiv 106
variable Parameteranzahl 37
Gültigkeitsbereich 41
Generator 41, 141
Higher-Order-Function 108
IDE
IntelliJ IDEA 24
NetBeans 23
Scala-IDE for Eclipse 22
Implicits 95
Import Selector Clause 81
IntelliJ IDEA 24
Interface
Rich 83
Stichwortverzeichnis
Java-Integration 29
Klasse
-Parameter 62
AnyRef 167
AnyVal 167
Any 165
Array 29, 155
ArrowAssoc 98, 169
Future 207
ListBuffer 30
List 28, 111
NodeSeq 178
ScalaObject 167
Set 34
TailCalls 107
abtrakte 73
Basis- 67
Case 119
leerer Rumpf 70
Sub- 67
Super- 67
versiegelte 122
Kommando
fsc 10, 15
javap 15
mvn 17
sbaz 10
sbt 19
scalac 10, 13
scaladoc 10, 16
scalap 10, 15
scala 9, 11
Kommentar 33
Konstruktor 62
auxiliary 63
primärer 62
zusätzlicher 63
Kontrollstruktur
do-while 40
for 41
if-else 40
while 40
eigene 135
Stichwortverzeichnis
Manifest 156
Maven-Scala-Plugin 17
Member 47
abtraktes 73
Methode 47
Überladen 55
!= 166
<fieldname>_= 50
+= 30
-> 169
== 166
andThen 125
apply 28, 59
asInstanceOf 167
assert 169
assume 169
copy 121
curried 133
equals 166
eq 168
error 169
exit 169
foreach 172
hashCode 166
isDefinedAt 125
isInstanceOf 167
iterator 172
lift 125
main 43
ne 168
orElse 125
println 170
readLine 170
require 169
r 131
toString 166
unapply 120
unary_<op> 59
update 29, 59
empty-paren 58
Extraktor- 120
Factory- 64
Getter 50
parameterless 58
313
Redefinition 50
Setter 50
Mixin 84
Nebenläufigkeit 193
NetBeans 23
Objekt
Actor 194
Predef 169
Companion- 53
Operator
<:< 158
<%< 158
+= 30
/: 113
:: 30
:> 151
:\ 113
<: 151
<% 154
=:= 158
Assoziativität 32
auf : endend 31
auf = endend 30
Cons 30
Infix 31, 59
Postfix 40, 59
Präfix 59
Priorität 32
zulässige Zeichen 32
Package 78
Package Object 79
Packages
nested 78
Parameter
By-Name- 140
implizite 98
variable Anzahl 37
Parameterliste
geschweifte Klammern 135
Parser 180
Packrat 181
partially applied function 110
314
Pattern
Case-Klassen 119
Extraktoren 128
regulärer Ausdruck 130
Teil- 126
Typ 116
Variable 116
Wildcard 115
XML 179
Pattern Matching 114
Guards 118
Polymorphie 72
Polymorphismus
parametrischer 148
Predef-Objekt 169
Property 52
Prozedur 35
Rekursion 104
REPL 10, 11
Rich-Wrapper 95
Sbt 19
Schlüsselwort 33
abstract 75
case 114, 119
catch 126
class 47
def 35
else 40
extends 67
finally 127
final 70
for 41, 141
if 40
implicit 95
import 80
lazy 102
match 114
new 28, 49, 62
object 47
override 50
package 78
private 56
protected 56
Stichwortverzeichnis
return 35
sealed 122
super 69
this 63
trait 83
try 126
type 39, 60
val 28
var 28
while 40
with 85
yield 143
Scope 41
Script 39
Self-Type-Annotation 160
Semikolon-Inferenz 27, 38
Sichtbarkeitsmodifier 56
private 56
protected 56
public 56
Companion-Objekt 57
Simple Build Tool 19
Thread 194
Trait 82
Actor 194
Application 42, 65
BitSet 175
ClassManifest 156
Functionn 104
Iterable 172
JavaTokenParsers 181
LinearSeq 173
Map 175
Ordered 87
PartialFunction 124
RegexParsers 181
Seq 173
Set 174
SortedMap 176
SortedSet 175
Traversable 172
Vector 173
Linearisierung 94
Stichwortverzeichnis
Stackable 88
Trampoline 107
Tupel 33
Zuweisung an 34
Typ
AnyRef 147
AnyVal 147
Any 147
Nothing 147
Null 147
Option 147
ScalaObject 147
Unit 35
_* 37
Bottom- 147
Boxing 157
Context Bound 155
existenzieller 162
Generalisierung 68
Generalized Type
Constraints 158
Inferenz 147
Infix-Schreibweise 148
Konstruktor 148
Lower Bound 151
parametrischer 148
parametrisierter 28
Spezialisierung 68, 157
struktureller 162
Sub- 68
Subtyp 149
Super- 68
Synonym 39, 60
Upper Bound 151
315
View Bound 154
Typinferenz 27
Typisierung 27, 147
Umgebungsvariable
JAVACMD 10
JAVA_HOME 11
JAVA_OPTS 11
Umwandlung
implizite 95
Uniform Access Principle 58
Variable
Instanz- 49
unveränderliche 28
veränderliche 28
Varianz
Annotation 150
kontravariant 150
kovariant 150
nonvariant 149
Vererbung 67
View 154
View Bound 154
XML 176
Brace Escapes 177
Literal 176
Pattern Matching 179
Zeichenkette
mehrzeilig 33
Zuweisung
gleichzeitig an mehrere
Bezeichner 34
Herunterladen