Sven Naumann, Marcel Rehfeld © Sven Naumann, Marcel Rehfeld
Lernziele <ul><li>Kennenlernen der Programmiersprache Scala </li></ul><ul><li>Grundlegende Syntax verstehen </li></ul><ul>...
Gliederung <ul><li>Einleitung </li></ul><ul><li>Geschichte </li></ul><ul><li>Scala im Vergleich zu Java </li></ul><ul><li>...
1. Einleitung <ul><li>Scala </li></ul><ul><li>Scala [skah-lah] </li></ul><ul><li>Skalierbar? </li></ul><ul><li>Gemischte K...
2. Geschichte <ul><li>Entwickelt von Martin Odersky </li></ul><ul><li>Wichtige Jahre: </li></ul><ul><ul><li>1995: Philip W...
Scala im Vergleich zu Java vs.  © Sven Naumann, Marcel Rehfeld
3. Scala im Vergleich zu Java <ul><li>Einführung </li></ul><ul><li>OOP </li></ul><ul><li>Methoden </li></ul><ul><li>Patter...
Vereinbarung <ul><li>Globale Code-Kennzeichnung: </li></ul>System.out.println(“Ich bin Java-Code.”) println(“Ich bin Scala...
Einführung © Sven Naumann, Marcel Rehfeld
HelloWorld.scala <ul><li>extends Application </li></ul><ul><ul><li>sehr einfach </li></ul></ul><ul><ul><li>„ Magic“ </li><...
Beispiel - main Methode <ul><li>object  definiert ein Singleton </li></ul><ul><li>Modifier  static  existiert nicht </li><...
Beispiel - main Methode (2) <ul><li>Explizite Definition von Variablen </li></ul><ul><ul><li>variable:Type </li></ul></ul>...
Iteration <ul><li>for -Schleife </li></ul><ul><li>0  ist ein Objekt  </li></ul><ul><ul><li>mit Methode  until </li></ul></...
Iteration (2) <ul><li>for-each -Schleife </li></ul><ul><li>Klasse  Array  verfügt über die Methode  foreach  </li></ul><ul...
While-Schleife <ul><li>Identische Syntax wie Java </li></ul>var i = 0;  while (i < 1000000) { ...; i = i+1 } var i = 0;  d...
Built-in Types <ul><li>Scala Types basieren auf Java Datentypen </li></ul><ul><li>Scala = Java (mit anderer Syntax) </li><...
Objektorientierung © Sven Naumann, Marcel Rehfeld
Import <ul><li>Mehr Kontrolle und bessere Übersicht </li></ul><ul><li>Konsistente Wildcard </li></ul>import java.awt.*; im...
Klassen <ul><li>Beispiel: </li></ul><ul><li>Mehrere Klassen in einer Datei </li></ul><ul><li>Dateiname unrelevant </li></u...
Reihenfolge der Deklarationen <ul><li>Reihenfolge von Methoden egal </li></ul><ul><li>Reihenfolge der Klassen egal </li></...
Klassen Felder <ul><li>Beispiel: </li></ul><ul><li>name  ist public </li></ul><ul><li>name = null </li></ul><ul><li>Kapsel...
Klassen Felder (2) <ul><li>Zwei Möglichkeiten in Java: </li></ul>public class Sportscar { public String name; } public cla...
Klassen Felder (3) <ul><li>Beispiel: </li></ul><ul><li>Was ist, wenn  name  nicht public sein soll? </li></ul><ul><li>Was ...
Klassen Felder (4) <ul><li>Beispiel: </li></ul>abstract class Car { private var theName:String = null def name = theName d...
Klassen Felder (5) <ul><li>Keine Probleme beim Design des Codes </li></ul><ul><li>Keine Beeinflussung vorhandener Elemente...
Konstruktoren <ul><li>Alle bisher vorgestellten Klassen hatten Konstruktoren </li></ul><ul><li>Jede Klasse in Scala hat ei...
Konstruktoren (2) <ul><li>Ausnahme bilden Methodendeklarationen: </li></ul><ul><ul><li>werden nicht als Teil des Konstrukt...
Konstruktoren (3) public class TestClass{ public TestClass(int number) { if (number > 3) { System.out.println(”Enough test...
Konstruktoren (4) <ul><li>Wie funktioniert Overloading? </li></ul><ul><ul><li>Verweis auf Standard-Konstruktor notwendig! ...
Konstruktor Parameter <ul><li>Alle Konstruktor-Parameter sind automatisch private und values.  </li></ul><ul><li>Zugriff i...
Konstruktor Parameter (2) <ul><li>var -Modifier macht  trips  public </li></ul>class TravelingTravelCar(var trips:Int) ext...
Konstruktor Parameter (3) public class Complex { private int a, b; public Complex(int a, int b) { this.a = a; this.b = b; ...
Methoden © Sven Naumann, Marcel Rehfeld
<ul><li>Modifier - Sichtbarkeit von Methoden </li></ul><ul><ul><li>kein  public  Modifier </li></ul></ul><ul><ul><li>prote...
Methoden (2) <ul><ul><li>private  Modifier </li></ul></ul><ul><ul><li>Scala ist mächtiger </li></ul></ul><ul><ul><li>Erlau...
Methoden (3) <ul><li>Andere Modifier: </li></ul><ul><ul><li>final </li></ul></ul><ul><ul><li>kein  abstract     Methode o...
Methoden (4) <ul><ul><li>synchronized  existiert nicht als Modifier </li></ul></ul>def syncMethod() = { synchronized { ......
Methoden (5) <ul><li>Implizite Ermittlung des Rückgabetyps </li></ul><ul><li>return  Statement optional </li></ul>def give...
Überschreiben von Methoden <ul><li>Wichtiges Konzept der OOP </li></ul><ul><li>Beispiel: </li></ul><ul><li>Ohne override M...
Überschreiben von Methoden (2) <ul><li>@Override  Annotation ist bei Java optional </li></ul><ul><li>Bei Scala  Modifier  ...
Static? <ul><li>static  Notation existiert in Scala nicht! </li></ul><ul><li>object  verwendet das Singleton Pattern </li>...
Static? (2) <ul><li>  einfache Verwendung von Singletons </li></ul><ul><li>Mischen von normalen und „static“ Feldern: </l...
Pattern Matching, Case Classes & Exceptions © Sven Naumann, Marcel Rehfeld
Pattern Matching <ul><li>Java Bsp.: </li></ul><ul><li>Switch-Case </li></ul><ul><li>Reiner Ersatz für if/else-Block </li><...
Pattern Matching (2) <ul><li>Syntax </li></ul><ul><li>Erstes Match gewinnt </li></ul><ul><li>Kein  return  notwendig </li>...
Pattern Matching (3) <ul><li>Für alle Typen möglich </li></ul><ul><li>case 1 prüft auf Integer 1 </li></ul><ul><li>case 2 ...
Case Classes © Sven Naumann, Marcel Rehfeld
Case Classes <ul><li>Sind reguläre Klassen </li></ul><ul><li>Exportieren die Parameter der Konstruktoren </li></ul><ul><li...
Case Classes (2) <ul><li>Beispiel: </li></ul>case class Number(value:Int) def checkPrime(n:Number) = n match { case Number...
Case Classes (3) © Sven Naumann, Marcel Rehfeld
Case Classes (4) class Color(val red:Int, val green:Int, val blue:Int) case class Red(r:Int) extends Color(r, 0, 0) case c...
Case Classes (5) <ul><li>printColor </li></ul><ul><ul><li>Prüfung ob Red, Green oder Blue </li></ul></ul><ul><ul><ul><li>b...
Exception Handling © Sven Naumann, Marcel Rehfeld
Exception Handling <ul><li>Implementierung fast wie bei Java </li></ul><ul><li>Unchecked Exceptions </li></ul><ul><li>Chec...
Exception Handling (2) <ul><li>Erinnert stark an Pattern Matching </li></ul><ul><li>Führt zu einem  catch -Block </li></ul...
Traits © Sven Naumann, Marcel Rehfeld
Traits <ul><li>Mehrfachvererbung </li></ul><ul><li>Diamond-Problem  </li></ul>© Sven Naumann, Marcel Rehfeld
Traits (2) <ul><li>Interfaces     schwache Lösung bei Java </li></ul><ul><ul><li>keine Implementierung erlaubt </li></ul>...
Traits (3) abstract class APerson { def sleep() } trait TStudent extends APerson { override def sleep() = { println(&quot;...
Traits (4) <ul><li>Erweitertes Beispiel: </li></ul>class CollegeStudent extends TWorker with TStudent with TLateRiser { } ...
Traits (5) <ul><li>Override  Modifier </li></ul><ul><ul><li>überschreibt Methode der Klasse davor (Reihenfolge ist wichtig...
Interoperabilität zwischen  Java und Scala © Sven Naumann, Marcel Rehfeld
Interoperabilität zwischen  Java und Scala <ul><li>Scala Klassen = Java Klassen </li></ul><ul><ul><li>identischer Bytecode...
Interoperabilität zwischen  Java und Scala (2) <ul><li>Traits </li></ul><ul><ul><li>viel mächtiger als Interfaces </li></u...
Vorteile und Nachteile © Sven Naumann, Marcel Rehfeld
4. Vorteile und Nachteile <ul><li>Vorteile: </li></ul><ul><ul><li>Skalierbar! </li></ul></ul><ul><ul><ul><li>einfacher Ein...
4. Vorteile und Nachteile (2) <ul><li>Vorteile: </li></ul><ul><ul><li>wird konstant weiterentwickelt  </li></ul></ul><ul><...
4. Vorteile und Nachteile (3) <ul><li>Nachteile: </li></ul><ul><ul><li>teilweise mangelnde Dokumentation </li></ul></ul><u...
Werkzeuge © Sven Naumann, Marcel Rehfeld
5. Werkzeuge <ul><li>Unterstützte IDEs </li></ul><ul><ul><li>Eclipse  </li></ul></ul><ul><ul><li>NetBeans </li></ul></ul><...
Einsatzgebiete und Ausblick © Sven Naumann, Marcel Rehfeld
6. Einsatzgebiete <ul><li>Anwendungsgebiete wie bei Java    Plattformunabhängig </li></ul><ul><li>Noch kein Einsatz für E...
7. Ausblick <ul><li>Großes Potential als Java Nachfolger </li></ul><ul><li>Am Tooling für Scala wird gearbeitet </li></ul>...
Literatur <ul><li>Odersky, Martin; u.a.: Programming in Scala. 1. Auflage. Mountain View, CA: Aritma Press, 2009. –  ISBN ...
Upcoming SlideShare
Loading in …5
×

Einführung in Scala im Vergleich mit Java

6,148 views
5,980 views

Published on

Eine kleine Einführung in Scala mit einem Hauptschwerpunkt auf den Vergleich mit Java.
Innerhalb der Präsentation werden viele Codefragmente von Java mit analogen Fragmenten in Scala verglichen.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,148
On SlideShare
0
From Embeds
0
Number of Embeds
73
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide
  • in Scala vorstellen, dass beides gleich ist. nur sehr umständlich altes beispiel vom auto:
  • Demo in Eclipse: Große Vorteile: ist private, sieht aber aus, wie ein public, code musste nicht neu gemacht werden
  • methoden können auch vorgegriffen werden, da nicht als teil des konstruktors erkannt
  • alle überladenen konstruktoren müssen (!) auf den default verweisen, der im klassenname deklariert ist.
  • Einführung in Scala im Vergleich mit Java

    1. 1. Sven Naumann, Marcel Rehfeld © Sven Naumann, Marcel Rehfeld
    2. 2. Lernziele <ul><li>Kennenlernen der Programmiersprache Scala </li></ul><ul><li>Grundlegende Syntax verstehen </li></ul><ul><li>Erkennen von Unterschieden zu Java </li></ul>© Sven Naumann, Marcel Rehfeld
    3. 3. Gliederung <ul><li>Einleitung </li></ul><ul><li>Geschichte </li></ul><ul><li>Scala im Vergleich zu Java </li></ul><ul><li>Vorteile und Nachteile </li></ul><ul><li>Werkzeuge </li></ul><ul><li>Einsatzgebiete </li></ul><ul><li>Ausblick </li></ul>© Sven Naumann, Marcel Rehfeld
    4. 4. 1. Einleitung <ul><li>Scala </li></ul><ul><li>Scala [skah-lah] </li></ul><ul><li>Skalierbar? </li></ul><ul><li>Gemischte Konzepte </li></ul><ul><ul><li>objekt-orientiert </li></ul></ul><ul><ul><li>funktional </li></ul></ul><ul><li>Leicht zu verstehen </li></ul><ul><li>Einfache Integration </li></ul>sc alable la nguage © Sven Naumann, Marcel Rehfeld
    5. 5. 2. Geschichte <ul><li>Entwickelt von Martin Odersky </li></ul><ul><li>Wichtige Jahre: </li></ul><ul><ul><li>1995: Philip Wadler -> Pizza </li></ul></ul><ul><ul><li>1999: Funnel </li></ul></ul><ul><ul><ul><li>„ Minimalism is great for language designers but not for users.“ </li></ul></ul></ul><ul><ul><li>2001: Start der Entwicklung von Scala </li></ul></ul><ul><ul><li>2003: Erstes Release </li></ul></ul><ul><ul><li>2006: Scala v 2.0 </li></ul></ul>© Sven Naumann, Marcel Rehfeld
    6. 6. Scala im Vergleich zu Java vs. © Sven Naumann, Marcel Rehfeld
    7. 7. 3. Scala im Vergleich zu Java <ul><li>Einführung </li></ul><ul><li>OOP </li></ul><ul><li>Methoden </li></ul><ul><li>Pattern Matching & Exceptions </li></ul><ul><li>Traits </li></ul><ul><li>Interoperabilität </li></ul>© Sven Naumann, Marcel Rehfeld
    8. 8. Vereinbarung <ul><li>Globale Code-Kennzeichnung: </li></ul>System.out.println(“Ich bin Java-Code.”) println(“Ich bin Scala-Code.”) © Sven Naumann, Marcel Rehfeld
    9. 9. Einführung © Sven Naumann, Marcel Rehfeld
    10. 10. HelloWorld.scala <ul><li>extends Application </li></ul><ul><ul><li>sehr einfach </li></ul></ul><ul><ul><li>„ Magic“ </li></ul></ul>object Main extends Application { println(&quot;Hello TIT07AIN :-)&quot;) } © Sven Naumann, Marcel Rehfeld
    11. 11. Beispiel - main Methode <ul><li>object definiert ein Singleton </li></ul><ul><li>Modifier static existiert nicht </li></ul><ul><li>Methoden werden implizit als Public definiert </li></ul><ul><li>Keine Semikolons </li></ul>object Main { def main(args:Array[String]):Unit = { println(args(0)) } } © Sven Naumann, Marcel Rehfeld
    12. 12. Beispiel - main Methode (2) <ul><li>Explizite Definition von Variablen </li></ul><ul><ul><li>variable:Type </li></ul></ul><ul><ul><li>var myInterger:Int </li></ul></ul><ul><ul><li>var str:String = &quot;Sven Naumann&quot; </li></ul></ul><ul><li>Implizite Definition von Variablen </li></ul><ul><ul><li>var name = „Sven Naumann“ </li></ul></ul><ul><li>Array ist eine echte Klasse </li></ul>public static void main(String[] args) { def main(args:Array[String]):Unit = { © Sven Naumann, Marcel Rehfeld
    13. 13. Iteration <ul><li>for -Schleife </li></ul><ul><li>0 ist ein Objekt </li></ul><ul><ul><li>mit Methode until </li></ul></ul><ul><ul><li>definiert ein Objekt der Klasse Range </li></ul></ul>for (i:Int <- 0 until args.length) { println(args(i)) } for (int i = 0; i < args.length; i++) { System.out.println(args[i]); } val range:Range = 0.until(args.length) for (i <- range) { © Sven Naumann, Marcel Rehfeld
    14. 14. Iteration (2) <ul><li>for-each -Schleife </li></ul><ul><li>Klasse Array verfügt über die Methode foreach </li></ul><ul><ul><li>Parameter ist ein Funktionsabschluss (Closure)  anonyme Funktion </li></ul></ul>args.foreach(a => { println(a) }) for (String a:args) { System.out.println(a); } args.foreach(a => println(a)) © Sven Naumann, Marcel Rehfeld
    15. 15. While-Schleife <ul><li>Identische Syntax wie Java </li></ul>var i = 0; while (i < 1000000) { ...; i = i+1 } var i = 0; do { ...; i = i+1 } while (x < 10) © Sven Naumann, Marcel Rehfeld
    16. 16. Built-in Types <ul><li>Scala Types basieren auf Java Datentypen </li></ul><ul><li>Scala = Java (mit anderer Syntax) </li></ul><ul><ul><li> Scala Bytecode ist auf JVM ausführbar </li></ul></ul>scala.Predef.String scala.Int Array[String] java.lang.String Int (Java primitive) String[] © Sven Naumann, Marcel Rehfeld
    17. 17. Objektorientierung © Sven Naumann, Marcel Rehfeld
    18. 18. Import <ul><li>Mehr Kontrolle und bessere Übersicht </li></ul><ul><li>Konsistente Wildcard </li></ul>import java.awt.*; import java.awt._ import java.awt.Color; import java.awt.Graphics; import java.awt.{Color, Graphics} © Sven Naumann, Marcel Rehfeld
    19. 19. Klassen <ul><li>Beispiel: </li></ul><ul><li>Mehrere Klassen in einer Datei </li></ul><ul><li>Dateiname unrelevant </li></ul><ul><li>Vererbung: </li></ul>class SomeTestClass { //... } class NewTestClass extends SomeTestClass { //... } © Sven Naumann, Marcel Rehfeld
    20. 20. Reihenfolge der Deklarationen <ul><li>Reihenfolge von Methoden egal </li></ul><ul><li>Reihenfolge der Klassen egal </li></ul>class Sum { def summe() = zahlEins()+zahlZwei() def zahlEins() = 1 def zahlZwei() = 2 } class Sportscar extends Auto { ... } abstract class Auto { ... } © Sven Naumann, Marcel Rehfeld
    21. 21. Klassen Felder <ul><li>Beispiel: </li></ul><ul><li>name ist public </li></ul><ul><li>name = null </li></ul><ul><li>Kapselung? </li></ul>abstract class Car { var name:String = null } © Sven Naumann, Marcel Rehfeld
    22. 22. Klassen Felder (2) <ul><li>Zwei Möglichkeiten in Java: </li></ul>public class Sportscar { public String name; } public class Sportscar { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } © Sven Naumann, Marcel Rehfeld
    23. 23. Klassen Felder (3) <ul><li>Beispiel: </li></ul><ul><li>Was ist, wenn name nicht public sein soll? </li></ul><ul><li>Was ist, wenn name geprüft werden soll? </li></ul>abstract class Car{ var name:String = null } © Sven Naumann, Marcel Rehfeld
    24. 24. Klassen Felder (4) <ul><li>Beispiel: </li></ul>abstract class Car { private var theName:String = null def name = theName def name_=(name:String)={ if (name != &quot;Smart&quot;){ theName = name println(&quot;Changed name to &quot;+name) }else{ println(&quot;This is no car!&quot;) } } } © Sven Naumann, Marcel Rehfeld
    25. 25. Klassen Felder (5) <ul><li>Keine Probleme beim Design des Codes </li></ul><ul><li>Keine Beeinflussung vorhandener Elemente </li></ul><ul><li>Sieht aus wie public </li></ul><ul><li>Keine Getter und Setter mehr </li></ul><ul><li> Demo </li></ul>© Sven Naumann, Marcel Rehfeld
    26. 26. Konstruktoren <ul><li>Alle bisher vorgestellten Klassen hatten Konstruktoren </li></ul><ul><li>Jede Klasse in Scala hat einen Konstruktor </li></ul><ul><li>Der Body der Klasse ist der Konstruktor </li></ul>© Sven Naumann, Marcel Rehfeld
    27. 27. Konstruktoren (2) <ul><li>Ausnahme bilden Methodendeklarationen: </li></ul><ul><ul><li>werden nicht als Teil des Konstruktors erkannt </li></ul></ul><ul><ul><li>können vorgegriffen werden </li></ul></ul>class TestClassCallsMethod { private var number =1 if (number < 3) { lessThree(number) } def lessThree(value:Int) = println(value+” is less than 3”) } var test = new TestClassCallsMethod() © Sven Naumann, Marcel Rehfeld
    28. 28. Konstruktoren (3) public class TestClass{ public TestClass(int number) { if (number > 3) { System.out.println(”Enough testing.&quot;); } } public void doSomething() { ... } } TestClass test =new Testclass(4); // “Enough testing.” class TestClass(number:Int) { if (number > 3) { println(”Enough testing.&quot;) } def doSomething() = { ... } } var test = new TestClass(4) // “Enough testing.” © Sven Naumann, Marcel Rehfeld
    29. 29. Konstruktoren (4) <ul><li>Wie funktioniert Overloading? </li></ul><ul><ul><li>Verweis auf Standard-Konstruktor notwendig! </li></ul></ul>class Citycar(ps:Int) extends Car { if (ps < 40) { println(&quot;Slow&quot;) } else { println(&quot;Fast&quot;) } def this() = { this(40) println(&quot;set default ps: 40&quot;) } } © Sven Naumann, Marcel Rehfeld
    30. 30. Konstruktor Parameter <ul><li>Alle Konstruktor-Parameter sind automatisch private und values. </li></ul><ul><li>Zugriff innerhalb von Methoden </li></ul><ul><li>Kein Reassignment </li></ul><ul><li>Was ist, wenn noch eine Reise gemacht wird? </li></ul>class TravelCar(trips:Int) extends Car{ def moreThanFive = trips > 5 } © Sven Naumann, Marcel Rehfeld
    31. 31. Konstruktor Parameter (2) <ul><li>var -Modifier macht trips public </li></ul>class TravelingTravelCar(var trips:Int) extends Car { def moreThanFive = trips > 5 def madeTrip() = { trips += 1 println(&quot;Made a trip, now &quot;+trips+&quot; trips.&quot;) } } © Sven Naumann, Marcel Rehfeld
    32. 32. Konstruktor Parameter (3) public class Complex { private int a, b; public Complex(int a, int b) { this.a = a; this.b = b; } public int getA() { return a; } public void setA(int a) { this.a = a; } public int getB() { return b; } public void setB(int b) { this.b = b; } } final Complex number = new Complex(1,0); number.setB(12); class Complex(var a:Int, var b:Int) val number = new Complex(1, 0) number.b = 12 © Sven Naumann, Marcel Rehfeld
    33. 33. Methoden © Sven Naumann, Marcel Rehfeld
    34. 34. <ul><li>Modifier - Sichtbarkeit von Methoden </li></ul><ul><ul><li>kein public Modifier </li></ul></ul><ul><ul><li>protected Modifier </li></ul></ul><ul><ul><ul><li>Zugriff nur von Sub-Klassen </li></ul></ul></ul><ul><ul><ul><li>Java erlaubt auch Zugriff im selben Package </li></ul></ul></ul>Methoden package testing.methods class MethodTestClass { protected[testing.methods] def method() = { ... } protected[de.dhbw.mannheim] def method() = { ... } } def method() = { ... } protected def method() = { ... } © Sven Naumann, Marcel Rehfeld
    35. 35. Methoden (2) <ul><ul><li>private Modifier </li></ul></ul><ul><ul><li>Scala ist mächtiger </li></ul></ul><ul><ul><li>Erlaubt Zugriff im selben Package, aber nicht von Sub-Klassen </li></ul></ul><ul><ul><li> Gilt auch für Feld-Variablen </li></ul></ul>private def method() = { ... } package testing.methods class MethodTestClass { protected[testing.methods] def method() = { ... } } © Sven Naumann, Marcel Rehfeld
    36. 36. Methoden (3) <ul><li>Andere Modifier: </li></ul><ul><ul><li>final </li></ul></ul><ul><ul><li>kein abstract  Methode ohne Implementierung wird implizit abstract </li></ul></ul><ul><ul><li>kein native  stattdessen Annotation </li></ul></ul>final def finalMethod():String = &quot;FinalValue&quot; def abstractMethod():String public abstract String abstractMethod(); @native def nativeMethod():String © Sven Naumann, Marcel Rehfeld
    37. 37. Methoden (4) <ul><ul><li>synchronized existiert nicht als Modifier </li></ul></ul>def syncMethod() = { synchronized { ... } } public synchronized void syncMethod() { ... } © Sven Naumann, Marcel Rehfeld
    38. 38. Methoden (5) <ul><li>Implizite Ermittlung des Rückgabetyps </li></ul><ul><li>return Statement optional </li></ul>def giveForename(name:String) = { var tmp = name.split(' ') tmp(0) } giveForename(&quot;Sven Naumann&quot;) def giveForename(name:String):String = { var tmp = name.split(' ') return tmp(0) } © Sven Naumann, Marcel Rehfeld
    39. 39. Überschreiben von Methoden <ul><li>Wichtiges Konzept der OOP </li></ul><ul><li>Beispiel: </li></ul><ul><li>Ohne override Modifier: “error overriding method drive in class Car of type ()Unit” </li></ul>class Car { def drive() = println(&quot;driving 140km/h&quot;) } class SportsCar extends Car { override def drive() = println(&quot;driving 240km/h&quot;) } © Sven Naumann, Marcel Rehfeld
    40. 40. Überschreiben von Methoden (2) <ul><li>@Override Annotation ist bei Java optional </li></ul><ul><li>Bei Scala Modifier (keine Annotation) </li></ul><ul><li>Zwingend notwendig bei Scala: </li></ul><ul><ul><li>Gefahr bei Unbekannter API  Override oder Overload ? </li></ul></ul><ul><ul><li>Mehrfachvererbergung (Traits)  was passiert bei gleichen Methodennamen? </li></ul></ul>© Sven Naumann, Marcel Rehfeld
    41. 41. Static? <ul><li>static Notation existiert in Scala nicht! </li></ul><ul><li>object verwendet das Singleton Pattern </li></ul>public class TestClass { public static int a = 1; } object TestClass { val a : Int } public class TestClass { private static TestClass instance; public int a ; private TestClass() {} public static synchronized TestClass getInstance() { ... } } © Sven Naumann, Marcel Rehfeld
    42. 42. Static? (2) <ul><li> einfache Verwendung von Singletons </li></ul><ul><li>Mischen von normalen und „static“ Feldern: </li></ul><ul><li>Scala Compiler ist in der Lage zu entscheiden, ob die Klasse oder das Object von TestClass gemeint ist </li></ul><ul><li> umständlich </li></ul>public class TestClass { public static int a = 1; public int b; } object TestClass { val a: Int } class TestClass { val b: Int; } © Sven Naumann, Marcel Rehfeld
    43. 43. Pattern Matching, Case Classes & Exceptions © Sven Naumann, Marcel Rehfeld
    44. 44. Pattern Matching <ul><li>Java Bsp.: </li></ul><ul><li>Switch-Case </li></ul><ul><li>Reiner Ersatz für if/else-Block </li></ul><ul><li>Unterstützt nur primitive Typen </li></ul><ul><li>z.B. String nicht möglich  Enum </li></ul><ul><li>Scala verwirft Switch-Case  Pattern Matching </li></ul>public boolean checkPrime(int number) { switch (number) { case 1: return true; case 2: return true; case 3: return true; case 5: return true; case 7: return true; default: return false; } } © Sven Naumann, Marcel Rehfeld
    45. 45. Pattern Matching (2) <ul><li>Syntax </li></ul><ul><li>Erstes Match gewinnt </li></ul><ul><li>Kein return notwendig </li></ul><ul><li>Wildcard als Default-Statement </li></ul><ul><li>Scala kann noch mehr  Demo </li></ul>def matchTest(x: Int): String = x match { case 1 => &quot;one&quot; case 2 => &quot;two&quot; case _ => &quot;many&quot; } println(matchTest(2)) // “two” © Sven Naumann, Marcel Rehfeld
    46. 46. Pattern Matching (3) <ul><li>Für alle Typen möglich </li></ul><ul><li>case 1 prüft auf Integer 1 </li></ul><ul><li>case 2 prüft auf String </li></ul><ul><li>case 3 prüft auf Typ </li></ul><ul><li>case 4 Wildcard </li></ul>def matchTest2(x: Any): Any = x match { case 1 => &quot;one&quot; case &quot;two&quot; => 2 case y: Int => ”Integer” case _ => “null” } println(matchTest2(&quot;two&quot;)) // 2 © Sven Naumann, Marcel Rehfeld
    47. 47. Case Classes © Sven Naumann, Marcel Rehfeld
    48. 48. Case Classes <ul><li>Sind reguläre Klassen </li></ul><ul><li>Exportieren die Parameter der Konstruktoren </li></ul><ul><li>Sind gut für das Pattern Matching </li></ul><ul><li>Helfen beim Zerlegen von Datenstrukturen </li></ul><ul><li>Bieten Möglichkeiten für Hilfsklassen </li></ul><ul><li>Können nicht von Case Classes erben </li></ul><ul><li>Werden abstrakt, wenn Implementierung abstrakter Methoden nicht erfolgt </li></ul>© Sven Naumann, Marcel Rehfeld
    49. 49. Case Classes (2) <ul><li>Beispiel: </li></ul>case class Number(value:Int) def checkPrime(n:Number) = n match { case Number(1) => true case Number(2) => true case Number(3) => true case Number(5) => true case Number(7) => true case Number(_) => false } println(checkPrime(Number(5))) // true println(checkPrime(Number(12))) // false © Sven Naumann, Marcel Rehfeld
    50. 50. Case Classes (3) © Sven Naumann, Marcel Rehfeld
    51. 51. Case Classes (4) class Color(val red:Int, val green:Int, val blue:Int) case class Red(r:Int) extends Color(r, 0, 0) case class Green(g:Int) extends Color(0, g, 0) case class Blue(b:Int) extends Color(0, 0, b) def printColor(c:Color) = c match { case Red(v) => println(&quot;Red: &quot; + v) case Green(v) => println(&quot;Green: &quot; + v) case Blue(v) => println(&quot;Blue: &quot; + v) case col:Color => { print(&quot;R: &quot; + col.red + &quot;, &quot;) print(&quot;G: &quot; + col.green + &quot;, &quot;) println(&quot;B: &quot; + col.blue) } case null => println(&quot;Invalid color&quot;) } © Sven Naumann, Marcel Rehfeld
    52. 52. Case Classes (5) <ul><li>printColor </li></ul><ul><ul><li>Prüfung ob Red, Green oder Blue </li></ul></ul><ul><ul><ul><li>bei Matching -> Property Value v von Instanz </li></ul></ul></ul><ul><ul><li>Prüfung ob Color </li></ul></ul><ul><ul><ul><li>bei Matching wird Color ausgegeben </li></ul></ul></ul><ul><ul><li>invalid Color </li></ul></ul><ul><li>Multi-line case </li></ul><ul><li>Matching übernimmt null-Prüfung </li></ul>© Sven Naumann, Marcel Rehfeld
    53. 53. Exception Handling © Sven Naumann, Marcel Rehfeld
    54. 54. Exception Handling <ul><li>Implementierung fast wie bei Java </li></ul><ul><li>Unchecked Exceptions </li></ul><ul><li>Checked könnten implementiert werden </li></ul><ul><li>Catch ist nicht erzwungen </li></ul>def doAnythingUntilFive(n:Int) = { if (n < 1 || n > 5) { throw new IllegalArgumentException(”Some Error.&quot;) } //... } © Sven Naumann, Marcel Rehfeld
    55. 55. Exception Handling (2) <ul><li>Erinnert stark an Pattern Matching </li></ul><ul><li>Führt zu einem catch -Block </li></ul><ul><li>finally analog zu Java </li></ul>try{ doAnythingUntilFive(7) } catch { case e:IllegalArgumentException => e.printStackTrace() // ... case e => { println(“Some other exception.”); e.printStackTrace() } } © Sven Naumann, Marcel Rehfeld
    56. 56. Traits © Sven Naumann, Marcel Rehfeld
    57. 57. Traits <ul><li>Mehrfachvererbung </li></ul><ul><li>Diamond-Problem </li></ul>© Sven Naumann, Marcel Rehfeld
    58. 58. Traits (2) <ul><li>Interfaces  schwache Lösung bei Java </li></ul><ul><ul><li>keine Implementierung erlaubt </li></ul></ul><ul><li>Traits  ermöglichen Mehrfachvererbung mit Methodenimplementierung </li></ul><ul><li>Beispiel: </li></ul>© Sven Naumann, Marcel Rehfeld
    59. 59. Traits (3) abstract class APerson { def sleep() } trait TStudent extends APerson { override def sleep() = { println(&quot;sleeping 8h&quot;) } def learn() = { println(&quot;learing..&quot;) } } trait TWorker extends APerson { override def sleep() = { println(&quot;sleeping 6h&quot;) } def work() = { println(&quot;working..&quot;) } } class CollegeStudent extends TWorker with TStudent { } © Sven Naumann, Marcel Rehfeld
    60. 60. Traits (4) <ul><li>Erweitertes Beispiel: </li></ul>class CollegeStudent extends TWorker with TStudent with TLateRiser { } © Sven Naumann, Marcel Rehfeld
    61. 61. Traits (5) <ul><li>Override Modifier </li></ul><ul><ul><li>überschreibt Methode der Klasse davor (Reihenfolge ist wichtig) </li></ul></ul><ul><ul><li>zwingend notwendig  Sicherstellung, dass Methode überschrieben wird, nicht überladen </li></ul></ul><ul><li>Keine Konstruktor Parameter bei Traits möglich </li></ul>© Sven Naumann, Marcel Rehfeld
    62. 62. Interoperabilität zwischen Java und Scala © Sven Naumann, Marcel Rehfeld
    63. 63. Interoperabilität zwischen Java und Scala <ul><li>Scala Klassen = Java Klassen </li></ul><ul><ul><li>identischer Bytecode </li></ul></ul><ul><ul><li>unproblematisch </li></ul></ul>class SomeShowClass extends SomeSuperClass{ private var isThisTrue = false def setTrue(b:Boolean){ isThisTrue = b } } public class AnyJavaImpl extends SomeShowClass{ //... some Java Actions } © Sven Naumann, Marcel Rehfeld
    64. 64. Interoperabilität zwischen Java und Scala (2) <ul><li>Traits </li></ul><ul><ul><li>viel mächtiger als Interfaces </li></ul></ul><ul><ul><li>Scala kann Traits in Interfaces (und Klassen) compilieren </li></ul></ul><ul><li>Field Variablen – Getter und Setter (Scala) </li></ul><ul><ul><li>mit @BeanProperty Annotation </li></ul></ul><ul><ul><li>Java Konventionen werden eingehalten </li></ul></ul><ul><ul><li> Demo </li></ul></ul><ul><li>scala-library.jar </li></ul>© Sven Naumann, Marcel Rehfeld
    65. 65. Vorteile und Nachteile © Sven Naumann, Marcel Rehfeld
    66. 66. 4. Vorteile und Nachteile <ul><li>Vorteile: </li></ul><ul><ul><li>Skalierbar! </li></ul></ul><ul><ul><ul><li>einfacher Einstieg für Anfänger </li></ul></ul></ul><ul><ul><ul><li>viele Möglichkeiten für fortgeschrittene Benutzer </li></ul></ul></ul><ul><ul><li>Syntax ist weniger wortreich (verbose)  Reduzierung der Codezeilen </li></ul></ul><ul><ul><li>„ Neue“ Konzepte wie funktionelle Programmierung, Traits, Pattern Matching, ... </li></ul></ul>© Sven Naumann, Marcel Rehfeld
    67. 67. 4. Vorteile und Nachteile (2) <ul><li>Vorteile: </li></ul><ul><ul><li>wird konstant weiterentwickelt </li></ul></ul><ul><ul><ul><li>Current Stable Release 2.7.7 (28. Okober 2009) </li></ul></ul></ul><ul><ul><ul><li>Release Candidate 2.8.0.RC1 (14. April 2010) </li></ul></ul></ul><ul><ul><li>Portabilität  funktioniert auch auf JVM </li></ul></ul>© Sven Naumann, Marcel Rehfeld
    68. 68. 4. Vorteile und Nachteile (3) <ul><li>Nachteile: </li></ul><ul><ul><li>teilweise mangelnde Dokumentation </li></ul></ul><ul><ul><li>Gefahr, dass objektorientierte Ansätze außer Acht gelassen werden </li></ul></ul><ul><ul><li>(noch) mangelnde IDE Unterstützung </li></ul></ul><ul><ul><ul><li>Refactoring funktioniert schlecht </li></ul></ul></ul><ul><ul><ul><li>Pakete werden nicht gefunden </li></ul></ul></ul><ul><ul><ul><li>... </li></ul></ul></ul>© Sven Naumann, Marcel Rehfeld
    69. 69. Werkzeuge © Sven Naumann, Marcel Rehfeld
    70. 70. 5. Werkzeuge <ul><li>Unterstützte IDEs </li></ul><ul><ul><li>Eclipse </li></ul></ul><ul><ul><li>NetBeans </li></ul></ul><ul><ul><li>IntelliJ IDEA </li></ul></ul><ul><li>Skripte -> Demo </li></ul><ul><li>Konsole -> Demo </li></ul>© Sven Naumann, Marcel Rehfeld
    71. 71. Einsatzgebiete und Ausblick © Sven Naumann, Marcel Rehfeld
    72. 72. 6. Einsatzgebiete <ul><li>Anwendungsgebiete wie bei Java  Plattformunabhängig </li></ul><ul><li>Noch kein Einsatz für Enterprise Projekte </li></ul><ul><ul><li>Schulung Programmier Team  Kosten? </li></ul></ul><ul><ul><li>Mangelnde IDE Unterstützung </li></ul></ul><ul><ul><li>Einsatz in kleinen Software Projekten </li></ul></ul><ul><ul><li>Unabhängige Teilprojekte, da Java kompatibel </li></ul></ul><ul><li>Twitter Message Queue verwendet Scala anstatt Ruby </li></ul>© Sven Naumann, Marcel Rehfeld
    73. 73. 7. Ausblick <ul><li>Großes Potential als Java Nachfolger </li></ul><ul><li>Am Tooling für Scala wird gearbeitet </li></ul><ul><ul><li>Scala 2.8 bringt IDE-freundlicheren Compiler </li></ul></ul><ul><ul><li>Langfristige Planung: Qualität der Java IDEs erreichen </li></ul></ul><ul><li>In Unternehmen sind zunächst gemischte Projekte Java – Scala denkbar </li></ul><ul><li>TIOBE Programming Community Index </li></ul><ul><ul><li>Java Platz 2, Scala Platz 27 </li></ul></ul>© Sven Naumann, Marcel Rehfeld
    74. 74. Literatur <ul><li>Odersky, Martin; u.a.: Programming in Scala. 1. Auflage. Mountain View, CA: Aritma Press, 2009. – ISBN 0-9815316-0-1 </li></ul><ul><li>Scala: The Scala Programming Language [online]. Letzte Aktualisierung 26.04.10, http://www.scala-lang.org </li></ul><ul><li>Spiewak, Daniel: Scala for Java Refugees [online]. Letzte Aktualisierung 24.03.09, http://www.codecommit.com/blog/category/scala </li></ul><ul><li>TIOBE Software, P rogramming Community Index [online]. Letzte Aktualisierung April 2010 http://www.tiobe.com/index.php/content/paperinfo/tpci/ </li></ul>© Sven Naumann, Marcel Rehfeld

    ×