SlideShare a Scribd company logo
1 of 4
Download to read offline
SCHWERPUNKTTHEMA 

Skalierbare Sprache

Scala – Teil 1: Einstieg
Heiko Seeberger, Jan Blankenhorn

Scala hat derzeit kräftigen Rückenwind. Und das zurecht, denn Scala
ist nicht nur einfacher, sondern auch mächtiger als Java. Ein knapper
und prägnanter Programmierstil sowie neue Möglichkeiten durch funk-
tionale Programmierung lassen Entwicklerherzen höher schlagen. Dazu
noch viel Flexibilität und volle Interoperabilität mit Java. Höchste Zeit
für eine Erkundungstour durch Scala-Land, zu der wir Sie im Rahmen
dieser Serie einladen.


     „Jeder sollte Scala lernen“, sagt zumindest Ted Neward.                   Ein weiterer Pluspunkt für Scala ist ihr hybrider Charakter:
    Warum eigentlich nicht? Als Entwickler sollten wir ja nach             Scala ist objekt-funktional. Das bedeutet, dass Scala das Beste aus
einem ungeschriebenen Gesetz ohnehin jedes Jahr eine neue                   den beiden Welten der Objektorientierung (OO) und der funkti-
Programmiersprache lernen. Aber wieso gerade Scala, wo es                   onalen Programmierung [WikiPedia] vereint. Manche Probleme
doch so viele andere Möglichkeiten gibt?                                    lassen sich gut mit OO-Konzepten behandeln, für andere sind
   Ganz einfach: Scala ist eine ausgereifte, objekt-funktionale,            funktionale Abstraktionen besser geeignet, z. B. Closures. Mit
statisch typisierte, leichtgewichtige, ausdrucksstarke, pragma-             Scala steht uns jederzeit die beste Variante zur Verfügung. Dar-
tische und skalierbare Sprache für die Java Virtual Machine,                über hinaus wird durch den hybriden Charakter ein sanfter Ein-
die 100 % „abwärtskompatibel“ zu Java ist.                                  stieg ermöglicht, indem z. B. für Java-Entwickler die bestehen-
   Zu viel auf einmal? Keine Sorge, wir werden in dieser Serie              den OO-Kenntnisse weiterhin gültig und anwendbar bleiben.
auf alle Argumente näher eingehen. In diesem ersten Teil ver-               Nach und nach können funktionale Ansätze aufgegriffen und
schaffen wir uns einen groben Überblick und in den beiden wei-              dadurch das volle Potenzial von Scala ausgeschöpft werden.
teren Teilen werden wir dann ausgewählte Themen vertiefen.                     Weitere Argumente für Scala sind z. B. die kompakte und
                                                                            ausdrucksstarke Notation, die fortschrittlichen Möglichkeiten
                                                                            zur Schaffung von internen oder externen DLSs, die herrlich
Warum Scala?                                                                einfache Handhabung von XML oder die volle Interoperabili-
                                                                            tät mit Java. Kurzum, es gibt jede Menge Gründe, dem Aufruf
Die Java-Plattform erfreut sich schon seit vielen Jahren enor-              von Ted Neward zu folgen und Scala-Land zu erkunden.
mer Beliebtheit und es sieht derzeit nicht so aus, als würde ihr
Stern bald untergehen. Allerdings hat die Sprache Java Kon-
kurrenz bekommen: Ursprünglich einziger Bewohner der Ja-                    Hello World à la Scala
va-Welt, tummeln sich dort heute etliche neue und zum Teil
auch alte Sprachen. Davon tun sich aktuell insbesondere JRu-                Natürlich beginnen wir unsere Erkundungstour mit dem Klas-
by, Groovy, Clojure und eben Scala hervor.                                  siker schlechthin:
   Natürlich ist ein Blick in die Glaskugel immer eine riskan-
                                                                               object Hello {
te Sache und daher werden wir hier nicht die Alleinherrschaft
                                                                                 def main(args: Array[String]) {
von Scala oder den Niedergang einer anderen Sprache weissa-                        println("Hello World!")
gen. Das ist wohl auch nicht nötig, denn mit hoher Wahrschein-                   }
lichkeit können wir davon ausgehen, dass wir in Zukunft po-                    }

lyglott programmieren werden, d. h. ein Miteinander von ver-
schiedenen Programmiersprachen erleben werden. Wir sind                     Zunächst entdecken wir viele Parallelen zu Java, aber auch ei-
überzeugt, dass Scala dabei eine Rolle spielen wird, und wagen              nige Unterschiede, z. B. die Schlüsselwörter object zur Definiti-
die Prognose, dass diese eher eine Haupt- als eine Nebenrolle               on von Singleton Objects und def zur Definition von Methoden
sein wird. Das sehen interessanterweise auch die Schöpfer von               sowie das Fehlen von Semikolons. Auf diese Details und vie-
Groovy und JRuby so [Stra09].                                               le weitere gehen wir noch ein, aber zunächst sorgen wir dafür,
   Scala ist – wie Java – eine statisch typisierte Sprache, d. h. der       dass unser Klassiker übersetzt und ausgeführt werden kann.
Compiler prüft, ob im Code „alles mit rechten Dingen zugeht“.                  Mit Version 2.8 gibt es endlich ordentliche Scala-Plug-Ins für
Aus unserer Sicht ist das für viele Einsatzszenarien von Vorteil,           populäre Entwicklungsumgebungen wie Eclipse, Netbeans
insbesondere im Zusammenspiel mit einem mächtigen Typsys-                   oder IntelliJ IDEA. Allerdings werden wir uns im Folgenden
tem. Denn so lassen sich Fehler schon frühzeitig – nämlich bei              auf die Kommandozeile bzw. auf die REPL (Read Evaluate Print
der Entwicklung – erkennen und vermeiden, wohingegen bei                    Loop) – die interaktive Scala-Konsole – beschränken. Das gibt
dynamisch typisierten Sprachen die eine oder andere „Über-                  uns zum einen ein „unverfälschtes Gefühl“ dafür, was hinter
raschung“ im Betrieb zu erwarten ist. Häufig wird gegen sta-                den Kulissen abläuft. Zum anderen ist interaktives Scripting in
tisch typisierte Sprachen vorgebracht, deren Code sei schwer-               der REPL auch in „echten“ Projekten oft sehr nützlich und sollte
gewichtig, z. B. wegen der erforderlichen Typdeklarationen.                 daher zum Handwerkszeug eines Scala-Entwicklers gehören.
Scala räumt mit diesem Argument gründlich auf: Typinferenz                     Für obiges „Hello World“ sowie die weiteren Beispiele be-
– der Compiler „errät“ die Typen – und eine enorme Flexibili-               nötigen wir also nur die Scala-Distribution in Version 2.8 [Sca-
tät der Sprache selbst lassen Scala-Code ebenso leichtgewichtig             laRC]. Nachdem wir das Archiv entpackt haben, finden wir im
erscheinen wie zum Beispiel Groovy-Code.                                    bin-Verzeichnis u. a. die Programme scalac und fsc (fast scala


 24                                                                                                                   JavaSPEKTRUM 2/2010
   SCHWERPUNKTTHEMA

compiler) zum Kompilieren sowie scala zum Ausführen von               ion Object, welches die Methode apply enthält, die eine neue
Scala-Programmen bzw. Starten der REPL. Wenn nicht anders             List-Instanz erzeugt. Wann immer wir auf einem Objekt einen
vermerkt, dann werden wir für die Code-Beispiele stets die            Aufruf versuchen, d. h. dahinter Klammern mit Argumenten
REPL verwenden: Starten Sie einfach scala, um die Beispiele           schreiben, übersetzt der Compiler das im Hintergrund in einen
nachzuvollziehen.                                                     Aufruf der Methode apply:
  Schreiben wir nun also unser „Hello World“ mit einem belie-           scala> List.apply(1, 3, 5)
bigen Texteditor, von denen viele bereits Syntax-Highlighting           res0: List[Int] = List(1, 3, 5)
für Scala beherrschen, in eine Datei namens Hello.scala, rufen
wir fsc Hello.scala auf und anschließend scala Hello. Dann soll-
ten wir den bekannten Gruß entgegen nehmen dürfen:                    Klassen und Felder
   demo$   vi Hello.scala
                                                                      Das funktioniert natürlich auch mit unseren eigenen Objek-
   demo$   fsc Hello.scala                                            ten, als Beispiel dient eine Person mit einem Namen. Zunächst
   demo$   scala Hello                                                schreiben wir die Klasse, wobei wir nach dem Klassennamen
   Hello   World!                                                     in Klammern die sogenannten Klassenparameter schreiben,
                                                                      die wir quasi als private Felder betrachten können:
                                                                        scala> class Person(name: String)
OO ganz einfach                                                         defined class Person


Wir nähern uns Scala zunächst aus der OO-Perspektive, für             Wenn wir keinen Zugriffsmodifizierer verwenden, dann kön-
viele Java-Entwickler ein vertrautes Terrain. In Sachen Objekt-       nen wir Klassen, Felder und Methoden öffentlich nutzen. Es
orientierung ist Scala einfacher als Java, denn in Scala ist alles,   gibt also im Gegensatz zu Java in Scala kein public, wohl jedoch
wirklich alles, ein Objekt. Somit gibt es in Scala auch keine pri-    protected und private.
mitiven Datentypen. Zum Beispiel steht anstelle von int in Java         Aus der Klassendefinition ergibt sich implizit der sogenann-
die Klasse Int in Scala:                                              te Primary Constructor, den wir mit allen Klassenparametern
   scala> val x = 1
                                                                      aufrufen:
   x: Int = 1                                                           scala> val angie = new Person("Angela Merkel")
                                                                        angie: Person = Person@6d0cecb2
Hier weisen wir der Variablen x ein Int-Objekt zu, wobei wir
das Schlüsselwort val verwenden, mit dem wir eine unverän-            Damit wir unsere Person auch sinnvoll nutzen können, müs-
derliche Variable erhalten. Zunächst fällt auf, dass wir kein         sen wir auf den Namen lesend zugreifen können. Dazu ma-
Semikolon benötigen: Dank der Semikolon-Inferenz ist das              chen wir den Klassenparameter zu einem unveränderlichen
nicht nötig, außer wenn wir z. B. mehrere Anweisungen in eine         Feld, indem wir das Schlüsselwort val voranstellen:
Zeile schreiben. Dann fällt auf, dass wir keinen Typ angeben:           scala> class Person(val name: String)
Dank der Typinferenz kann der Compiler den Typ automatisch              defined class Person
bestimmen. Wie wir anhand der Antwort der REPL sehen, wird
in unserem Beispiel Int als Typ verwendet. Natürlich könnten          Nun können wir auf das Attribut mit der von Java gewohnten
wir auch explizit einen Typ vorgeben, indem wir nach dem Va-          Punktnotation zugreifen:
riablennamen einen Doppelpunkt und den Typ schreiben:                   scala> angie.name
   scala> val x: Double = 1                                             res0: String = Angela Merkel
   x: Double = 1.0
                                                                      Bevor wir uns dem Companion Object zuwenden, halten wir
In der Praxis erweist sich die Typinferenz als sehr probates Mit-     kurz inne, um einen Vergleich zu Java zu ziehen: Mit einer Zei-
tel, um knappen und lesbaren Code zu erhalten. Denken wir             le Scala-Code haben wir eine Klasse definiert, die ein lesbares
zum Beispiel an eine Liste von ganzen Zahlen. In Java müss-           Feld enthält. Das entspricht einer Java-Klasse mit einem priva-
ten wir auf der „linken Seite“ List<Integer> und auf der „rechten     ten Feld, einem Konstruktor, der dieses Feld initialisiert, und
Seite“ ArrayList<Integer> schreiben. In Scala genügt List auf der     einem Getter. Je nachdem, wie wir Codezeilen zählen wollen,
„rechten Seite“, denn auch die Parametrisierung der List mit          eine drastische Einsparung!
Int wird automatisch erkannt:

   scala> val odds = List(1, 3, 5)
                                                                      Methoden
   odds: List[Int] = List(1, 3, 5)                                    Kommen wir nun zum Companion Object, das die Methode ap-
                                                                      ply implementieren soll:
Im Vorgriff auf die nächste Folge: Hier geben die eckigen Klas-         scala> object Person {
sen den Typparameter an, so ähnlich wie die spitzen Klam-                 | def apply(name: String) = new Person(name)
mern bei den Java Generics.                                               | }
                                                                        defined module Person

Singleton Objects statt static
Wie in aller Welt funktioniert eigentlich List(1, 3, 5)? Ganz ein-    Die REPL erkennt, wenn unsere Eingaben trotz Zeilenumbruch
fach: In Scala gibt es neben Klassen, die wir mit dem Schlüs-         noch nicht vollständig sind, und signalisiert das, indem sie ei-
selwort class definieren, auch sogenannte Singleton Objects,          nen vertikalen Strich voranstellt. Dieser ist eine Besonderheit
die wir mit dem Schlüsselwort object erzeugen. Diese sind ech-        der REPL und nicht Bestandteil des Scala-Codes.
te Objekte, die auch als Parameter übergeben werden können.             In Scala definieren wir Methoden mit dem Schlüsselwort
Dafür gibt es – ganz im Sinne der reinen Objektorientierung –         def, gefolgt vom Namen der Methode und der Parameterliste.
keine static Members.                                                 Anschließend könnten wir optional nach einem Doppelpunkt
  Neben der Klasse List gibt es in der Scala-Bibliothek auch          den Rückgabetyp angeben, aber hier setzen wir wieder auf
ein gleichnamiges Singleton Object, ein sogenanntes Compan-           Typinferenz. Die Implementierung der Methode wird durch

www.javaspektrum.de                                                                                                               25
SCHWERPUNKTTHEMA 

das Gleichheitszeichen eingeleitet. Für Einzeiler können die       lassen sich FP-Programme sehr gut testen, ja wir können sogar
geschweiften Klammern entfallen. Als Rückgabewert wird in          deren Korrektheit beweisen.
Scala immer der letzte Ausdruck verwendet, in unserem Fall            Soweit könnten wir prinzipiell auch mit Java funktional pro-
also eine neue Instanz von Person.                                 grammieren. Jedoch kennt die funktionale Programmierung
  Nun können wir neue Personen auch ohne das Schlüssel-            sogenannte Funktionen höherer Ordnung, d. h. Funktionen,
wort new erzeugen, weil die Methode apply auf dem Companion        denen andere Funktionen als Aufrufparameter übergeben wer-
Object aufgerufen wird:                                            den können. Auf diese Weise können FP-Programme durch
  scala> val angie = Person("Angela Merkel")
                                                                   Komposition von Funktionen erstellt werden. Spätestens hier
  angie: Person = Person@7a15b555                                  enden die Java-Möglichkeiten, wenngleich Closures für Java 7
                                                                   in der Planung sind.
Damit unser kleines Beispiel so richtig rund ist, wollen wir          So viel zur Theorie. Was bedeutet das für Scala in der Praxis? Be-
noch die toString-Methode überschreiben, sodass der Name           trachten wir dazu als Beispiel einer Liste mit ungeraden Zahlen:
ausgegeben wird:                                                      scala> val odds = List(1, 3, 5)
  scala> class Person(val name: String) {                             odds: List[Int] = List(1, 3, 5)
    | override def toString = name
    | }                                                            Wie machen wir daraus gerade Zahlen? Indem wir zu jedem
  defined class Person                                             Element eins addieren:
                                                                      scala> val evens = odds map { x => x + 1 }
Um Methoden zu überschreiben, müssen wir das Schlüsselwort            evens: List[Int] = List(2, 4, 6)
override verwenden. Da toString keine Parameter hat, lassen wir
gleich die komplette Parameterliste, d. h. auch die Klammern,      Zunächst weisen wir auf die Verwendung der Infix-Operator-
weg. Nachdem wir unser Companion Object nochmals neu de-           Notation hin, d. h. wir könnten auch odds.map(x => x + 1) schrei-
finiert haben, gibt die REPL beim Anlegen einer neuen Person       ben. Weiter fällt auf, dass wir geschweifte Klammern statt run-
deren Namen aus:                                                   der verwenden dürfen, um zu verdeutlichen, dass das Argu-
  scala> val angie = Person("Angela Merkel")
                                                                   ment kein „normaler“ Wert, sondern ein Funktionsliteral ist.
  angie: Person = Angela Merkel                                       Wir sehen hier also den Aufruf der Methode map auf einem
                                                                   List-Objekt. Diese Methode erwartet einen Parameter vom Typ
                                                                   Function1, d. h. eine Funktion mit einem Parameter. Und der
Operatoren                                                         Ausdruck x => x + 1 stellt einen Wert für so eine Funktion dar.
Da in Scala alles ein Objekt ist, gibt es natürlich keine Opera-   Links vom Pfeil steht die Parameterliste, hier nur ein Parameter
toren, sondern nur Methoden. Allerdings gibt es viel weniger       mit dem Namen x. Dank Typinferenz verzichten wir wieder
Einschränkungen als in Java, welche Zeichen verwendet wer-         auf die Angabe des Typs, aber natürlich könnten wir auch x:
den dürfen. Deshalb können wir für die Methodennamen auch          Int => x + 1 schreiben. Rechts vom Pfeil steht die Implementie-
„Operator“-Zeichen verwenden. Zum Beispiel ist + eine Me-          rung der Funktion, hier nur ein einfacher Einzeiler.
thode der Klasse Int:                                                 Wenn in Scala alles ein Objekt ist, dann müssten doch auch
  scala> x.+(1)
                                                                   Funktionen Objekte sein, oder? Richtig! Wir können eine Funk-
  res0: Int = 2                                                    tion definieren und diese einer Variable zuweisen:
                                                                      scala> val add = (x: Int, y: Int) => x + y
Das sieht natürlich komisch aus, wenn die Addition als „klas-
                                                                      add: (Int, Int) => Int = <function2>
sischer“ Methodenaufruf geschrieben wird. Daher erlaubt Sca-
la auch die sogenannte Infix-Operator-Notation, bei der Punkt      Die so definierte Funktion vom Typ Function2 können wir aufru-
und Klammern entfallen:                                            fen, indem wir in Klammern die beiden Aufrufparameter hin-
  scala> x + 1
                                                                   ter den Variablennamen schreiben. Auch hier wird im Hinter-
  res1: Int = 2                                                    grund der Compiler die Methode apply aufrufen, die von jedem
                                                                   Funktionstyp implementiert wird:
Bitte beachten Sie, dass x.+(y) und x + y nur unterschiedliche        scala> add(1, 2)
Schreibweisen für den Aufruf der Methode + auf dem Objekt x           res0: Int = 3
mit dem Parameter y sind. Die Infix-Operator-Notation funk-
tioniert natürlich nicht nur für Ints, sondern kann ganz allge-    OK, weitere FP-Details werden in den kommenden Teilen fol-
mein immer dann verwendet werden, wenn eine Methode ge-            gen. Hier wollen wir abschließend den konzeptionellen Unter-
nau einen Parameter erwartet.                                      schied zu Java betrachten: Wir haben durch das Funktionslite-
                                                                   ral ausgedrückt, was wir tun wollen. In Java hätten wir auf im-
                                                                   perative Weise angegeben, wie es getan werden soll, nämlich
Warum auf Java Closures warten?                                    durch eine Iteration.
                                                                     Das Wie ist in den meisten Fällen jedoch ein „low-level“ Detail,
Damit beenden wir unseren Ausflug zu den OO-Eigenschaften          um das wir uns nicht kümmern möchten. Mit funktionaler Pro-
von Scala und wenden uns der funktionalen Programmierung           grammierung erreichen wir eine höhere Abstraktionsebene und
(FP) zu. Ohne hier zu tief einzusteigen, wollen wir ganz kurz      somit gesteigerte Produktivität. Und das gilt nicht nur für das Pro-
die wichtigsten FP-Grundlagen erläutern:                           grammieren, sondern auch für das Lesen und Verstehen von Code.
  Zunächst einmal besteht ein FP-Programm aus Funktionen,
die Aufrufparameter und ein Resultat haben, also „so etwas“
wie Methoden sind. Nach der reinen Lehre sind Funktionen frei      Fazit
von Seiteneffekten, also unabhängig vom Programmzustand,
sodass wiederholte Aufrufe immer dasselbe Resultat ergeben.        In diesem ersten Überblick über Scala haben wir gesehen, dass
Darüber hinaus gibt es nur unveränderliche Werte. Dadurch          Scala im Vergleich zu Java einfacher und zugleich mächtiger

 26                                                                                                                JavaSPEKTRUM 2/2010
           SCHWERPUNKTTHEMA

ist. Zunächst fallen die leichtgewichtige Syntax auf und die       [WikiPedia] Funktionale Programmierung,
Möglichkeiten, Code einzusparen. Dann gibt es keine „Aus-          de.wikipedia.org/wiki/Funktionale_Programmierung
nahmen“ wie primitive Datentypen oder Operatoren, sondern
Scala ist Objektorientierung pur. Und schließlich ermöglicht
die funktionale Programmierung höhere Abstraktionen und
kompakteren Code. In den kommenden Folgen werden wir
die begonnenen Themen vertiefen und neue kennenlernen.                               Heiko Seeberger ist geschäftsführender Gesell-
                                                                                     schafter der Weigle Wilczek GmbH und verantwortlich
                                                                                     für die technologische Strategie des Unternehmens
                                                                                     mit den Schwerpunkten Java, Scala, OSGi, Eclipse RCP
Literatur und Links                                                                  und Lift. Zudem ist er aktiver Open Source Committer,
                                                                                     Autor zahlreicher Fachartikel und Redner auf einschlä-
[New08] T. Neward, The busy Java developer’s guide to Scala:                         gigen Konferenzen.
Functional programming for the object oriented,                                      E-Mail: seeberger@weiglewilczek.com.
http://www.ibm.com/developerworks/java/library/j-scala01228.html
                                                                                     Jan Blankenhorn ist Softwareentwickler bei der
[OdSpVe08] M. Odersky, L. Spoon, B. Venners, Programming                             Weigle Wilczek GmbH. Er entwickelt sowohl dyna-
in Scala: A comprehensive step-by-step guide, artima 2008                            mische Ajax-Webanwendungen als auch Rich Clients
[Scala] The Scala Programming Language,                                              mit Eclipse RCP. Neben Softwareentwicklungs- und
http://www.scala-lang.org/                                                           -wartungsprojekten ist er als Trainer für Eclipse RCP im
[ScalaRC] Scala Downloads, Version 2.8, www.scala-lang.org/                          Rahmen der Eclipse Training Alliance aktiv.
[Stra09] James Strachan’s Blog, Scala as a long term replace-                        E-Mail: blankenhorn@weiglewilczek.com
ment for java/javac, 6.7.2009, macstrac.blogspot.com/2009/04/
scala-as-long-term-replacement-for.html




www.javaspektrum.de                                                                                                                         27

More Related Content

Viewers also liked

Red de Comunicadores de Aysén
Red de Comunicadores de AysénRed de Comunicadores de Aysén
Red de Comunicadores de AysénARSChile
 
Frank diaz morlaes 801 jm
Frank diaz morlaes 801 jmFrank diaz morlaes 801 jm
Frank diaz morlaes 801 jmFrank Diaz
 
Emprende.com - Webinar - El Primer Paso hacia el Emprendurismo
Emprende.com - Webinar - El Primer Paso hacia el EmprendurismoEmprende.com - Webinar - El Primer Paso hacia el Emprendurismo
Emprende.com - Webinar - El Primer Paso hacia el EmprendurismoEmprende.com
 
Los adolescentes y el uso de las nuevas
Los adolescentes y el uso de las nuevasLos adolescentes y el uso de las nuevas
Los adolescentes y el uso de las nuevasraul10enero1968
 
Iso27002 110513165257-phpapp01
Iso27002 110513165257-phpapp01Iso27002 110513165257-phpapp01
Iso27002 110513165257-phpapp01Adrian Lopez
 
El cuercospin mimoso
El cuercospin mimoso El cuercospin mimoso
El cuercospin mimoso martiinsuarez
 
Chicaque erika
Chicaque erikaChicaque erika
Chicaque erikatauritho
 
El cuerpoespin mimoso
El cuerpoespin mimoso El cuerpoespin mimoso
El cuerpoespin mimoso martiinsuarez
 
Política de privacidad Google
Política de privacidad GooglePolítica de privacidad Google
Política de privacidad GoogleLucho Saavedra
 
Chicaque erika
Chicaque erikaChicaque erika
Chicaque erikatauritho
 
Frank diaz morlaes 801 jm
Frank diaz morlaes 801 jmFrank diaz morlaes 801 jm
Frank diaz morlaes 801 jmFrank Diaz
 
Descentralización
DescentralizaciónDescentralización
Descentralizaciónereinoso43
 

Viewers also liked (20)

neXTkonferenz 2.0: Prof. Dr. Rolf Kreibich
neXTkonferenz 2.0: Prof. Dr. Rolf KreibichneXTkonferenz 2.0: Prof. Dr. Rolf Kreibich
neXTkonferenz 2.0: Prof. Dr. Rolf Kreibich
 
neXTkonferenz 2.0 – Jugendarbeit in Niedersachsen
neXTkonferenz 2.0 – Jugendarbeit in NiedersachsenneXTkonferenz 2.0 – Jugendarbeit in Niedersachsen
neXTkonferenz 2.0 – Jugendarbeit in Niedersachsen
 
Red de Comunicadores de Aysén
Red de Comunicadores de AysénRed de Comunicadores de Aysén
Red de Comunicadores de Aysén
 
Frank diaz morlaes 801 jm
Frank diaz morlaes 801 jmFrank diaz morlaes 801 jm
Frank diaz morlaes 801 jm
 
El amor.ppt finaaaal
El amor.ppt finaaaalEl amor.ppt finaaaal
El amor.ppt finaaaal
 
Emprende.com - Webinar - El Primer Paso hacia el Emprendurismo
Emprende.com - Webinar - El Primer Paso hacia el EmprendurismoEmprende.com - Webinar - El Primer Paso hacia el Emprendurismo
Emprende.com - Webinar - El Primer Paso hacia el Emprendurismo
 
Adonde fui 2
Adonde fui 2Adonde fui 2
Adonde fui 2
 
Los adolescentes y el uso de las nuevas
Los adolescentes y el uso de las nuevasLos adolescentes y el uso de las nuevas
Los adolescentes y el uso de las nuevas
 
Grasas protegidas
Grasas protegidasGrasas protegidas
Grasas protegidas
 
Claes oldenburg
Claes oldenburgClaes oldenburg
Claes oldenburg
 
Iso27002 110513165257-phpapp01
Iso27002 110513165257-phpapp01Iso27002 110513165257-phpapp01
Iso27002 110513165257-phpapp01
 
El cuercospin mimoso
El cuercospin mimoso El cuercospin mimoso
El cuercospin mimoso
 
Chicaque erika
Chicaque erikaChicaque erika
Chicaque erika
 
El cuerpoespin mimoso
El cuerpoespin mimoso El cuerpoespin mimoso
El cuerpoespin mimoso
 
Práctica 30
Práctica 30Práctica 30
Práctica 30
 
Política de privacidad Google
Política de privacidad GooglePolítica de privacidad Google
Política de privacidad Google
 
Chicaque erika
Chicaque erikaChicaque erika
Chicaque erika
 
Frank diaz morlaes 801 jm
Frank diaz morlaes 801 jmFrank diaz morlaes 801 jm
Frank diaz morlaes 801 jm
 
El Amor
El AmorEl Amor
El Amor
 
Descentralización
DescentralizaciónDescentralización
Descentralización
 

Similar to JavaSPEKTRUM - Scala 1

JM 08/09 - Beginning Scala Review
JM 08/09 - Beginning Scala ReviewJM 08/09 - Beginning Scala Review
JM 08/09 - Beginning Scala ReviewHeiko Seeberger
 
Java Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit LiftJava Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit LiftJohannes Hohenbichler
 
Fundamentale Muster in Java
Fundamentale Muster in JavaFundamentale Muster in Java
Fundamentale Muster in Javatutego
 
Article - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der EntwicklerArticle - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der EntwicklerWolfgang Weigend
 
Jm 10.13 weigend_lagergren_nashorn
Jm 10.13 weigend_lagergren_nashornJm 10.13 weigend_lagergren_nashorn
Jm 10.13 weigend_lagergren_nashornWolfgang Weigend
 
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...Lukas Eder
 
SCALA: ein kurzer Überblick
SCALA: ein kurzer ÜberblickSCALA: ein kurzer Überblick
SCALA: ein kurzer ÜberblickRoland Ewald
 
Scala 4 Enterprise
Scala 4 EnterpriseScala 4 Enterprise
Scala 4 Enterpriseadesso AG
 
6 - Sprachen des Semantic Web - RDF(S) Frameworks
6 - Sprachen des Semantic Web - RDF(S) Frameworks6 - Sprachen des Semantic Web - RDF(S) Frameworks
6 - Sprachen des Semantic Web - RDF(S) FrameworksSteffen Schloenvoigt
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im VergleichQAware GmbH
 
Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007smancke
 
Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureDr. Christian Betz
 

Similar to JavaSPEKTRUM - Scala 1 (20)

JM 08/09 - ScalaModules
JM 08/09 - ScalaModulesJM 08/09 - ScalaModules
JM 08/09 - ScalaModules
 
JM 08/09 - Beginning Scala Review
JM 08/09 - Beginning Scala ReviewJM 08/09 - Beginning Scala Review
JM 08/09 - Beginning Scala Review
 
Scala
ScalaScala
Scala
 
JavaSPEKTRUM - Scala 3
JavaSPEKTRUM - Scala 3JavaSPEKTRUM - Scala 3
JavaSPEKTRUM - Scala 3
 
Java Magazin - Lift
Java Magazin - LiftJava Magazin - Lift
Java Magazin - Lift
 
Java Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit LiftJava Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit Lift
 
Fundamentale Muster in Java
Fundamentale Muster in JavaFundamentale Muster in Java
Fundamentale Muster in Java
 
Article - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der EntwicklerArticle - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der Entwickler
 
Jm 10.13 weigend_lagergren_nashorn
Jm 10.13 weigend_lagergren_nashornJm 10.13 weigend_lagergren_nashorn
Jm 10.13 weigend_lagergren_nashorn
 
Scala Workshop
Scala WorkshopScala Workshop
Scala Workshop
 
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...
iJUG Java Aktuell [Februar 2015] Lukas Eder - jOOQ - ein alternativer Weg mit...
 
SCALA: ein kurzer Überblick
SCALA: ein kurzer ÜberblickSCALA: ein kurzer Überblick
SCALA: ein kurzer Überblick
 
Scala 4 Enterprise
Scala 4 EnterpriseScala 4 Enterprise
Scala 4 Enterprise
 
6 - Sprachen des Semantic Web - RDF(S) Frameworks
6 - Sprachen des Semantic Web - RDF(S) Frameworks6 - Sprachen des Semantic Web - RDF(S) Frameworks
6 - Sprachen des Semantic Web - RDF(S) Frameworks
 
Workshop: Besseres C#
Workshop: Besseres C#Workshop: Besseres C#
Workshop: Besseres C#
 
Bit WiSe 2013 | Basisinformationstechnologie I - 08: Programmiersprachen I
Bit WiSe 2013 | Basisinformationstechnologie I - 08: Programmiersprachen IBit WiSe 2013 | Basisinformationstechnologie I - 08: Programmiersprachen I
Bit WiSe 2013 | Basisinformationstechnologie I - 08: Programmiersprachen I
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
 
Enterprise JS
Enterprise JS Enterprise JS
Enterprise JS
 
Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007
 
Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit Clojure
 

More from Heiko Seeberger

Scaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of ScalazScaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of ScalazHeiko Seeberger
 
RheinJUG 2010 - Sprechen Sie Scala?
RheinJUG 2010 - Sprechen Sie Scala?RheinJUG 2010 - Sprechen Sie Scala?
RheinJUG 2010 - Sprechen Sie Scala?Heiko Seeberger
 
Objektforum 2010 - Sprechen Sie Scala?
Objektforum 2010 - Sprechen Sie Scala?Objektforum 2010 - Sprechen Sie Scala?
Objektforum 2010 - Sprechen Sie Scala?Heiko Seeberger
 
OSGi DevCon Europe 09 - OSGi on Scala
OSGi DevCon Europe 09 - OSGi on ScalaOSGi DevCon Europe 09 - OSGi on Scala
OSGi DevCon Europe 09 - OSGi on ScalaHeiko Seeberger
 
JAX 09 - OSGi Service Components Models
JAX 09 - OSGi Service Components ModelsJAX 09 - OSGi Service Components Models
JAX 09 - OSGi Service Components ModelsHeiko Seeberger
 
Eclipse Magazin 12 - Design by Contract
Eclipse Magazin 12 - Design by ContractEclipse Magazin 12 - Design by Contract
Eclipse Magazin 12 - Design by ContractHeiko Seeberger
 
Eclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der DreiEclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der DreiHeiko Seeberger
 
Eclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance LoggingEclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance LoggingHeiko Seeberger
 
Eclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on EquinoxEclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on EquinoxHeiko Seeberger
 
Eclipse Magazin 12 - Security does matter
Eclipse Magazin 12 - Security does matterEclipse Magazin 12 - Security does matter
Eclipse Magazin 12 - Security does matterHeiko Seeberger
 
EclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCPEclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCPHeiko Seeberger
 
W-JAX 07 - AOP im Einsatz mit OSGi und RCP
W-JAX 07 - AOP im Einsatz mit OSGi und RCPW-JAX 07 - AOP im Einsatz mit OSGi und RCP
W-JAX 07 - AOP im Einsatz mit OSGi und RCPHeiko Seeberger
 
W-JAX 08 - Declarative Services versus Spring Dynamic Modules
W-JAX 08 - Declarative Services versus Spring Dynamic ModulesW-JAX 08 - Declarative Services versus Spring Dynamic Modules
W-JAX 08 - Declarative Services versus Spring Dynamic ModulesHeiko Seeberger
 
JAX 08 - Experiences using Equinox Aspects in a real-world Project
JAX 08 - Experiences using Equinox Aspects in a real-world ProjectJAX 08 - Experiences using Equinox Aspects in a real-world Project
JAX 08 - Experiences using Equinox Aspects in a real-world ProjectHeiko Seeberger
 
Eclipse Summit Europe 08 - Aspect Weaving for OSGi
Eclipse Summit Europe 08 - Aspect Weaving for OSGiEclipse Summit Europe 08 - Aspect Weaving for OSGi
Eclipse Summit Europe 08 - Aspect Weaving for OSGiHeiko Seeberger
 

More from Heiko Seeberger (20)

Scaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of ScalazScaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of Scalaz
 
RheinJUG 2010 - Sprechen Sie Scala?
RheinJUG 2010 - Sprechen Sie Scala?RheinJUG 2010 - Sprechen Sie Scala?
RheinJUG 2010 - Sprechen Sie Scala?
 
Objektforum 2010 - Sprechen Sie Scala?
Objektforum 2010 - Sprechen Sie Scala?Objektforum 2010 - Sprechen Sie Scala?
Objektforum 2010 - Sprechen Sie Scala?
 
W-JAX 09 - ScalaModules
W-JAX 09 - ScalaModulesW-JAX 09 - ScalaModules
W-JAX 09 - ScalaModules
 
W-JAX 09 - Lift
W-JAX 09 - LiftW-JAX 09 - Lift
W-JAX 09 - Lift
 
OSGi DevCon Europe 09 - OSGi on Scala
OSGi DevCon Europe 09 - OSGi on ScalaOSGi DevCon Europe 09 - OSGi on Scala
OSGi DevCon Europe 09 - OSGi on Scala
 
JAX 09 - OSGi on Scala
JAX 09 - OSGi on ScalaJAX 09 - OSGi on Scala
JAX 09 - OSGi on Scala
 
JAX 09 - OSGi Service Components Models
JAX 09 - OSGi Service Components ModelsJAX 09 - OSGi Service Components Models
JAX 09 - OSGi Service Components Models
 
JAX 08 - Agile RCP
JAX 08 - Agile RCPJAX 08 - Agile RCP
JAX 08 - Agile RCP
 
Eclipse Magazin 12 - Design by Contract
Eclipse Magazin 12 - Design by ContractEclipse Magazin 12 - Design by Contract
Eclipse Magazin 12 - Design by Contract
 
JUGM 07 - AspectJ
JUGM 07 - AspectJJUGM 07 - AspectJ
JUGM 07 - AspectJ
 
Eclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der DreiEclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der Drei
 
Eclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance LoggingEclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance Logging
 
Eclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on EquinoxEclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on Equinox
 
Eclipse Magazin 12 - Security does matter
Eclipse Magazin 12 - Security does matterEclipse Magazin 12 - Security does matter
Eclipse Magazin 12 - Security does matter
 
EclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCPEclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCP
 
W-JAX 07 - AOP im Einsatz mit OSGi und RCP
W-JAX 07 - AOP im Einsatz mit OSGi und RCPW-JAX 07 - AOP im Einsatz mit OSGi und RCP
W-JAX 07 - AOP im Einsatz mit OSGi und RCP
 
W-JAX 08 - Declarative Services versus Spring Dynamic Modules
W-JAX 08 - Declarative Services versus Spring Dynamic ModulesW-JAX 08 - Declarative Services versus Spring Dynamic Modules
W-JAX 08 - Declarative Services versus Spring Dynamic Modules
 
JAX 08 - Experiences using Equinox Aspects in a real-world Project
JAX 08 - Experiences using Equinox Aspects in a real-world ProjectJAX 08 - Experiences using Equinox Aspects in a real-world Project
JAX 08 - Experiences using Equinox Aspects in a real-world Project
 
Eclipse Summit Europe 08 - Aspect Weaving for OSGi
Eclipse Summit Europe 08 - Aspect Weaving for OSGiEclipse Summit Europe 08 - Aspect Weaving for OSGi
Eclipse Summit Europe 08 - Aspect Weaving for OSGi
 

JavaSPEKTRUM - Scala 1

  • 1. SCHWERPUNKTTHEMA  Skalierbare Sprache Scala – Teil 1: Einstieg Heiko Seeberger, Jan Blankenhorn Scala hat derzeit kräftigen Rückenwind. Und das zurecht, denn Scala ist nicht nur einfacher, sondern auch mächtiger als Java. Ein knapper und prägnanter Programmierstil sowie neue Möglichkeiten durch funk- tionale Programmierung lassen Entwicklerherzen höher schlagen. Dazu noch viel Flexibilität und volle Interoperabilität mit Java. Höchste Zeit für eine Erkundungstour durch Scala-Land, zu der wir Sie im Rahmen dieser Serie einladen. „Jeder sollte Scala lernen“, sagt zumindest Ted Neward. Ein weiterer Pluspunkt für Scala ist ihr hybrider Charakter:  Warum eigentlich nicht? Als Entwickler sollten wir ja nach Scala ist objekt-funktional. Das bedeutet, dass Scala das Beste aus einem ungeschriebenen Gesetz ohnehin jedes Jahr eine neue den beiden Welten der Objektorientierung (OO) und der funkti- Programmiersprache lernen. Aber wieso gerade Scala, wo es onalen Programmierung [WikiPedia] vereint. Manche Probleme doch so viele andere Möglichkeiten gibt? lassen sich gut mit OO-Konzepten behandeln, für andere sind Ganz einfach: Scala ist eine ausgereifte, objekt-funktionale, funktionale Abstraktionen besser geeignet, z. B. Closures. Mit statisch typisierte, leichtgewichtige, ausdrucksstarke, pragma- Scala steht uns jederzeit die beste Variante zur Verfügung. Dar- tische und skalierbare Sprache für die Java Virtual Machine, über hinaus wird durch den hybriden Charakter ein sanfter Ein- die 100 % „abwärtskompatibel“ zu Java ist. stieg ermöglicht, indem z. B. für Java-Entwickler die bestehen- Zu viel auf einmal? Keine Sorge, wir werden in dieser Serie den OO-Kenntnisse weiterhin gültig und anwendbar bleiben. auf alle Argumente näher eingehen. In diesem ersten Teil ver- Nach und nach können funktionale Ansätze aufgegriffen und schaffen wir uns einen groben Überblick und in den beiden wei- dadurch das volle Potenzial von Scala ausgeschöpft werden. teren Teilen werden wir dann ausgewählte Themen vertiefen. Weitere Argumente für Scala sind z. B. die kompakte und ausdrucksstarke Notation, die fortschrittlichen Möglichkeiten zur Schaffung von internen oder externen DLSs, die herrlich Warum Scala? einfache Handhabung von XML oder die volle Interoperabili- tät mit Java. Kurzum, es gibt jede Menge Gründe, dem Aufruf Die Java-Plattform erfreut sich schon seit vielen Jahren enor- von Ted Neward zu folgen und Scala-Land zu erkunden. mer Beliebtheit und es sieht derzeit nicht so aus, als würde ihr Stern bald untergehen. Allerdings hat die Sprache Java Kon- kurrenz bekommen: Ursprünglich einziger Bewohner der Ja- Hello World à la Scala va-Welt, tummeln sich dort heute etliche neue und zum Teil auch alte Sprachen. Davon tun sich aktuell insbesondere JRu- Natürlich beginnen wir unsere Erkundungstour mit dem Klas- by, Groovy, Clojure und eben Scala hervor. siker schlechthin: Natürlich ist ein Blick in die Glaskugel immer eine riskan- object Hello { te Sache und daher werden wir hier nicht die Alleinherrschaft def main(args: Array[String]) { von Scala oder den Niedergang einer anderen Sprache weissa- println("Hello World!") gen. Das ist wohl auch nicht nötig, denn mit hoher Wahrschein- } lichkeit können wir davon ausgehen, dass wir in Zukunft po- } lyglott programmieren werden, d. h. ein Miteinander von ver- schiedenen Programmiersprachen erleben werden. Wir sind Zunächst entdecken wir viele Parallelen zu Java, aber auch ei- überzeugt, dass Scala dabei eine Rolle spielen wird, und wagen nige Unterschiede, z. B. die Schlüsselwörter object zur Definiti- die Prognose, dass diese eher eine Haupt- als eine Nebenrolle on von Singleton Objects und def zur Definition von Methoden sein wird. Das sehen interessanterweise auch die Schöpfer von sowie das Fehlen von Semikolons. Auf diese Details und vie- Groovy und JRuby so [Stra09]. le weitere gehen wir noch ein, aber zunächst sorgen wir dafür, Scala ist – wie Java – eine statisch typisierte Sprache, d. h. der dass unser Klassiker übersetzt und ausgeführt werden kann. Compiler prüft, ob im Code „alles mit rechten Dingen zugeht“. Mit Version 2.8 gibt es endlich ordentliche Scala-Plug-Ins für Aus unserer Sicht ist das für viele Einsatzszenarien von Vorteil, populäre Entwicklungsumgebungen wie Eclipse, Netbeans insbesondere im Zusammenspiel mit einem mächtigen Typsys- oder IntelliJ IDEA. Allerdings werden wir uns im Folgenden tem. Denn so lassen sich Fehler schon frühzeitig – nämlich bei auf die Kommandozeile bzw. auf die REPL (Read Evaluate Print der Entwicklung – erkennen und vermeiden, wohingegen bei Loop) – die interaktive Scala-Konsole – beschränken. Das gibt dynamisch typisierten Sprachen die eine oder andere „Über- uns zum einen ein „unverfälschtes Gefühl“ dafür, was hinter raschung“ im Betrieb zu erwarten ist. Häufig wird gegen sta- den Kulissen abläuft. Zum anderen ist interaktives Scripting in tisch typisierte Sprachen vorgebracht, deren Code sei schwer- der REPL auch in „echten“ Projekten oft sehr nützlich und sollte gewichtig, z. B. wegen der erforderlichen Typdeklarationen. daher zum Handwerkszeug eines Scala-Entwicklers gehören. Scala räumt mit diesem Argument gründlich auf: Typinferenz Für obiges „Hello World“ sowie die weiteren Beispiele be- – der Compiler „errät“ die Typen – und eine enorme Flexibili- nötigen wir also nur die Scala-Distribution in Version 2.8 [Sca- tät der Sprache selbst lassen Scala-Code ebenso leichtgewichtig laRC]. Nachdem wir das Archiv entpackt haben, finden wir im erscheinen wie zum Beispiel Groovy-Code. bin-Verzeichnis u. a. die Programme scalac und fsc (fast scala 24 JavaSPEKTRUM 2/2010
  • 2. SCHWERPUNKTTHEMA compiler) zum Kompilieren sowie scala zum Ausführen von ion Object, welches die Methode apply enthält, die eine neue Scala-Programmen bzw. Starten der REPL. Wenn nicht anders List-Instanz erzeugt. Wann immer wir auf einem Objekt einen vermerkt, dann werden wir für die Code-Beispiele stets die Aufruf versuchen, d. h. dahinter Klammern mit Argumenten REPL verwenden: Starten Sie einfach scala, um die Beispiele schreiben, übersetzt der Compiler das im Hintergrund in einen nachzuvollziehen. Aufruf der Methode apply: Schreiben wir nun also unser „Hello World“ mit einem belie- scala> List.apply(1, 3, 5) bigen Texteditor, von denen viele bereits Syntax-Highlighting res0: List[Int] = List(1, 3, 5) für Scala beherrschen, in eine Datei namens Hello.scala, rufen wir fsc Hello.scala auf und anschließend scala Hello. Dann soll- ten wir den bekannten Gruß entgegen nehmen dürfen: Klassen und Felder demo$ vi Hello.scala Das funktioniert natürlich auch mit unseren eigenen Objek- demo$ fsc Hello.scala ten, als Beispiel dient eine Person mit einem Namen. Zunächst demo$ scala Hello schreiben wir die Klasse, wobei wir nach dem Klassennamen Hello World! in Klammern die sogenannten Klassenparameter schreiben, die wir quasi als private Felder betrachten können: scala> class Person(name: String) OO ganz einfach defined class Person Wir nähern uns Scala zunächst aus der OO-Perspektive, für Wenn wir keinen Zugriffsmodifizierer verwenden, dann kön- viele Java-Entwickler ein vertrautes Terrain. In Sachen Objekt- nen wir Klassen, Felder und Methoden öffentlich nutzen. Es orientierung ist Scala einfacher als Java, denn in Scala ist alles, gibt also im Gegensatz zu Java in Scala kein public, wohl jedoch wirklich alles, ein Objekt. Somit gibt es in Scala auch keine pri- protected und private. mitiven Datentypen. Zum Beispiel steht anstelle von int in Java Aus der Klassendefinition ergibt sich implizit der sogenann- die Klasse Int in Scala: te Primary Constructor, den wir mit allen Klassenparametern scala> val x = 1 aufrufen: x: Int = 1 scala> val angie = new Person("Angela Merkel") angie: Person = Person@6d0cecb2 Hier weisen wir der Variablen x ein Int-Objekt zu, wobei wir das Schlüsselwort val verwenden, mit dem wir eine unverän- Damit wir unsere Person auch sinnvoll nutzen können, müs- derliche Variable erhalten. Zunächst fällt auf, dass wir kein sen wir auf den Namen lesend zugreifen können. Dazu ma- Semikolon benötigen: Dank der Semikolon-Inferenz ist das chen wir den Klassenparameter zu einem unveränderlichen nicht nötig, außer wenn wir z. B. mehrere Anweisungen in eine Feld, indem wir das Schlüsselwort val voranstellen: Zeile schreiben. Dann fällt auf, dass wir keinen Typ angeben: scala> class Person(val name: String) Dank der Typinferenz kann der Compiler den Typ automatisch defined class Person bestimmen. Wie wir anhand der Antwort der REPL sehen, wird in unserem Beispiel Int als Typ verwendet. Natürlich könnten Nun können wir auf das Attribut mit der von Java gewohnten wir auch explizit einen Typ vorgeben, indem wir nach dem Va- Punktnotation zugreifen: riablennamen einen Doppelpunkt und den Typ schreiben: scala> angie.name scala> val x: Double = 1 res0: String = Angela Merkel x: Double = 1.0 Bevor wir uns dem Companion Object zuwenden, halten wir In der Praxis erweist sich die Typinferenz als sehr probates Mit- kurz inne, um einen Vergleich zu Java zu ziehen: Mit einer Zei- tel, um knappen und lesbaren Code zu erhalten. Denken wir le Scala-Code haben wir eine Klasse definiert, die ein lesbares zum Beispiel an eine Liste von ganzen Zahlen. In Java müss- Feld enthält. Das entspricht einer Java-Klasse mit einem priva- ten wir auf der „linken Seite“ List<Integer> und auf der „rechten ten Feld, einem Konstruktor, der dieses Feld initialisiert, und Seite“ ArrayList<Integer> schreiben. In Scala genügt List auf der einem Getter. Je nachdem, wie wir Codezeilen zählen wollen, „rechten Seite“, denn auch die Parametrisierung der List mit eine drastische Einsparung! Int wird automatisch erkannt: scala> val odds = List(1, 3, 5) Methoden odds: List[Int] = List(1, 3, 5) Kommen wir nun zum Companion Object, das die Methode ap- ply implementieren soll: Im Vorgriff auf die nächste Folge: Hier geben die eckigen Klas- scala> object Person { sen den Typparameter an, so ähnlich wie die spitzen Klam- | def apply(name: String) = new Person(name) mern bei den Java Generics. | } defined module Person Singleton Objects statt static Wie in aller Welt funktioniert eigentlich List(1, 3, 5)? Ganz ein- Die REPL erkennt, wenn unsere Eingaben trotz Zeilenumbruch fach: In Scala gibt es neben Klassen, die wir mit dem Schlüs- noch nicht vollständig sind, und signalisiert das, indem sie ei- selwort class definieren, auch sogenannte Singleton Objects, nen vertikalen Strich voranstellt. Dieser ist eine Besonderheit die wir mit dem Schlüsselwort object erzeugen. Diese sind ech- der REPL und nicht Bestandteil des Scala-Codes. te Objekte, die auch als Parameter übergeben werden können. In Scala definieren wir Methoden mit dem Schlüsselwort Dafür gibt es – ganz im Sinne der reinen Objektorientierung – def, gefolgt vom Namen der Methode und der Parameterliste. keine static Members. Anschließend könnten wir optional nach einem Doppelpunkt Neben der Klasse List gibt es in der Scala-Bibliothek auch den Rückgabetyp angeben, aber hier setzen wir wieder auf ein gleichnamiges Singleton Object, ein sogenanntes Compan- Typinferenz. Die Implementierung der Methode wird durch www.javaspektrum.de 25
  • 3. SCHWERPUNKTTHEMA  das Gleichheitszeichen eingeleitet. Für Einzeiler können die lassen sich FP-Programme sehr gut testen, ja wir können sogar geschweiften Klammern entfallen. Als Rückgabewert wird in deren Korrektheit beweisen. Scala immer der letzte Ausdruck verwendet, in unserem Fall Soweit könnten wir prinzipiell auch mit Java funktional pro- also eine neue Instanz von Person. grammieren. Jedoch kennt die funktionale Programmierung Nun können wir neue Personen auch ohne das Schlüssel- sogenannte Funktionen höherer Ordnung, d. h. Funktionen, wort new erzeugen, weil die Methode apply auf dem Companion denen andere Funktionen als Aufrufparameter übergeben wer- Object aufgerufen wird: den können. Auf diese Weise können FP-Programme durch scala> val angie = Person("Angela Merkel") Komposition von Funktionen erstellt werden. Spätestens hier angie: Person = Person@7a15b555 enden die Java-Möglichkeiten, wenngleich Closures für Java 7 in der Planung sind. Damit unser kleines Beispiel so richtig rund ist, wollen wir So viel zur Theorie. Was bedeutet das für Scala in der Praxis? Be- noch die toString-Methode überschreiben, sodass der Name trachten wir dazu als Beispiel einer Liste mit ungeraden Zahlen: ausgegeben wird: scala> val odds = List(1, 3, 5) scala> class Person(val name: String) { odds: List[Int] = List(1, 3, 5) | override def toString = name | } Wie machen wir daraus gerade Zahlen? Indem wir zu jedem defined class Person Element eins addieren: scala> val evens = odds map { x => x + 1 } Um Methoden zu überschreiben, müssen wir das Schlüsselwort evens: List[Int] = List(2, 4, 6) override verwenden. Da toString keine Parameter hat, lassen wir gleich die komplette Parameterliste, d. h. auch die Klammern, Zunächst weisen wir auf die Verwendung der Infix-Operator- weg. Nachdem wir unser Companion Object nochmals neu de- Notation hin, d. h. wir könnten auch odds.map(x => x + 1) schrei- finiert haben, gibt die REPL beim Anlegen einer neuen Person ben. Weiter fällt auf, dass wir geschweifte Klammern statt run- deren Namen aus: der verwenden dürfen, um zu verdeutlichen, dass das Argu- scala> val angie = Person("Angela Merkel") ment kein „normaler“ Wert, sondern ein Funktionsliteral ist. angie: Person = Angela Merkel Wir sehen hier also den Aufruf der Methode map auf einem List-Objekt. Diese Methode erwartet einen Parameter vom Typ Function1, d. h. eine Funktion mit einem Parameter. Und der Operatoren Ausdruck x => x + 1 stellt einen Wert für so eine Funktion dar. Da in Scala alles ein Objekt ist, gibt es natürlich keine Opera- Links vom Pfeil steht die Parameterliste, hier nur ein Parameter toren, sondern nur Methoden. Allerdings gibt es viel weniger mit dem Namen x. Dank Typinferenz verzichten wir wieder Einschränkungen als in Java, welche Zeichen verwendet wer- auf die Angabe des Typs, aber natürlich könnten wir auch x: den dürfen. Deshalb können wir für die Methodennamen auch Int => x + 1 schreiben. Rechts vom Pfeil steht die Implementie- „Operator“-Zeichen verwenden. Zum Beispiel ist + eine Me- rung der Funktion, hier nur ein einfacher Einzeiler. thode der Klasse Int: Wenn in Scala alles ein Objekt ist, dann müssten doch auch scala> x.+(1) Funktionen Objekte sein, oder? Richtig! Wir können eine Funk- res0: Int = 2 tion definieren und diese einer Variable zuweisen: scala> val add = (x: Int, y: Int) => x + y Das sieht natürlich komisch aus, wenn die Addition als „klas- add: (Int, Int) => Int = <function2> sischer“ Methodenaufruf geschrieben wird. Daher erlaubt Sca- la auch die sogenannte Infix-Operator-Notation, bei der Punkt Die so definierte Funktion vom Typ Function2 können wir aufru- und Klammern entfallen: fen, indem wir in Klammern die beiden Aufrufparameter hin- scala> x + 1 ter den Variablennamen schreiben. Auch hier wird im Hinter- res1: Int = 2 grund der Compiler die Methode apply aufrufen, die von jedem Funktionstyp implementiert wird: Bitte beachten Sie, dass x.+(y) und x + y nur unterschiedliche scala> add(1, 2) Schreibweisen für den Aufruf der Methode + auf dem Objekt x res0: Int = 3 mit dem Parameter y sind. Die Infix-Operator-Notation funk- tioniert natürlich nicht nur für Ints, sondern kann ganz allge- OK, weitere FP-Details werden in den kommenden Teilen fol- mein immer dann verwendet werden, wenn eine Methode ge- gen. Hier wollen wir abschließend den konzeptionellen Unter- nau einen Parameter erwartet. schied zu Java betrachten: Wir haben durch das Funktionslite- ral ausgedrückt, was wir tun wollen. In Java hätten wir auf im- perative Weise angegeben, wie es getan werden soll, nämlich Warum auf Java Closures warten? durch eine Iteration. Das Wie ist in den meisten Fällen jedoch ein „low-level“ Detail, Damit beenden wir unseren Ausflug zu den OO-Eigenschaften um das wir uns nicht kümmern möchten. Mit funktionaler Pro- von Scala und wenden uns der funktionalen Programmierung grammierung erreichen wir eine höhere Abstraktionsebene und (FP) zu. Ohne hier zu tief einzusteigen, wollen wir ganz kurz somit gesteigerte Produktivität. Und das gilt nicht nur für das Pro- die wichtigsten FP-Grundlagen erläutern: grammieren, sondern auch für das Lesen und Verstehen von Code. Zunächst einmal besteht ein FP-Programm aus Funktionen, die Aufrufparameter und ein Resultat haben, also „so etwas“ wie Methoden sind. Nach der reinen Lehre sind Funktionen frei Fazit von Seiteneffekten, also unabhängig vom Programmzustand, sodass wiederholte Aufrufe immer dasselbe Resultat ergeben. In diesem ersten Überblick über Scala haben wir gesehen, dass Darüber hinaus gibt es nur unveränderliche Werte. Dadurch Scala im Vergleich zu Java einfacher und zugleich mächtiger 26 JavaSPEKTRUM 2/2010
  • 4. SCHWERPUNKTTHEMA ist. Zunächst fallen die leichtgewichtige Syntax auf und die [WikiPedia] Funktionale Programmierung, Möglichkeiten, Code einzusparen. Dann gibt es keine „Aus- de.wikipedia.org/wiki/Funktionale_Programmierung nahmen“ wie primitive Datentypen oder Operatoren, sondern Scala ist Objektorientierung pur. Und schließlich ermöglicht die funktionale Programmierung höhere Abstraktionen und kompakteren Code. In den kommenden Folgen werden wir die begonnenen Themen vertiefen und neue kennenlernen. Heiko Seeberger ist geschäftsführender Gesell- schafter der Weigle Wilczek GmbH und verantwortlich für die technologische Strategie des Unternehmens mit den Schwerpunkten Java, Scala, OSGi, Eclipse RCP Literatur und Links und Lift. Zudem ist er aktiver Open Source Committer, Autor zahlreicher Fachartikel und Redner auf einschlä- [New08] T. Neward, The busy Java developer’s guide to Scala: gigen Konferenzen. Functional programming for the object oriented, E-Mail: seeberger@weiglewilczek.com. http://www.ibm.com/developerworks/java/library/j-scala01228.html Jan Blankenhorn ist Softwareentwickler bei der [OdSpVe08] M. Odersky, L. Spoon, B. Venners, Programming Weigle Wilczek GmbH. Er entwickelt sowohl dyna- in Scala: A comprehensive step-by-step guide, artima 2008 mische Ajax-Webanwendungen als auch Rich Clients [Scala] The Scala Programming Language, mit Eclipse RCP. Neben Softwareentwicklungs- und http://www.scala-lang.org/ -wartungsprojekten ist er als Trainer für Eclipse RCP im [ScalaRC] Scala Downloads, Version 2.8, www.scala-lang.org/ Rahmen der Eclipse Training Alliance aktiv. [Stra09] James Strachan’s Blog, Scala as a long term replace- E-Mail: blankenhorn@weiglewilczek.com ment for java/javac, 6.7.2009, macstrac.blogspot.com/2009/04/ scala-as-long-term-replacement-for.html www.javaspektrum.de 27