Scala: Klassen, Methoden und Objekte von Simon Lerch Überblick ● Methoden ● Klassen ● Objekte ● Basis Typen ● Prefixes ● Java's == vs. Scala's == ● Assoziativität von Operatoren ● Rich Wrapper 30.03.10 Klassen, Methoden und Objekte 2 Parameter ● Methoden def add(x: Int,y: Int) Rückgabewerte ● def add(x: Int,y: Int): Int = {return x + y} ● def add(x: Int,y: Int): Int = {x + y} ● def add(x: Int,y: Int) = { x + y } Single Expressions brauchen keine Klammern! Unit als Rückgabewert: ● def run(): Unit = "rennt" 30.03.10 Klassen, Methoden und Objekte 3 Methoden Operatoren sind Methoden! ● 1 + 2 = 1 .+(2) ● def +(y: Int) = { x = x + y } Das heißt auch, dass Methodennamen Sonderzeichen enthalten dürfen. Ausnahmen sind natürlich Zeichen die für die Syntax gebraucht werden! 30.03.10 Klassen, Methoden und Objekte 4 Klassen Eine einfache Klasse aus der letzten Übung: class Rational(numer: Int, denom: Int){ private def gcd(a: Int, b: Int): Int = if(a == b) a else gcd(a min b, a - b abs) override def toString = numer + "/" + denom def reduce = { val g = gcd(numer, denom) new Rational(numer/g, denom/g) } } def extend(f: Int) = { new Rational(numer*f, denom*f) } 30.03.10 Klassen, Methoden und Objekte 5 Private Klassen, Methoden und Variablen können jeweils auf private gesetzt werden. 30.03.10 Klassen, Methoden und Objekte 6 Konstruktor Der Primär Konstruktor wird gleich neben dem Klassennamen angegeben. Beispiel: „class Rational(numer: Int, denom: Int)“ ● Parameter des Konstruktors sind in der kompletten Klasse zugänglich. ● Andere Konstruktoren müssen als erstes auf den Main Konstruktor verweisen. 30.03.10 Klassen, Methoden und Objekte 7 Beispiel: class YellBot(text: String){ println(text) println(text) def this(){ this("Dummy text!!!") } } new YellBot("Ni Hao!") new YellBot() 30.03.10 Klassen, Methoden und Objekte 8 Objekte Objekte ersetzen statics aus Java (singleton objects) Beispiel: object Robot{ def sayHello = { "hello!" } } ausführen: println(Robot.sayHello) 30.03.10 Klassen, Methoden und Objekte 9 Objekte in Verbindung mit einer Klasse (companion class) Wenn eine Klasse und ein Objekt den gleichen Namen besitzen und in der selben Datei stehen, dann teilen sich beide ihre privaten Variablen. Ein Namenskonflikt kann dabei nicht entstehen, da die Namensräume getrennt verwaltet werden. Bietet eine gute Möglichkeit um eine factory für die Klasse zu erstellen. 30.03.10 Klassen, Methoden und Objekte 10 Beispiel class CopyCounter{ CopyCounter.copyCreatedCounter = CopyCounter.copyCreatedCounter + 1 } object CopyCounter{ private var copyCreatedCounter = 0 } def getCount() = copyCreatedCounter new CopyCounter new CopyCounter new CopyCounter new CopyCounter println(CopyCounter.getCount()) 30.03.10 Klassen, Methoden und Objekte 11 Objekte Die Main Methode Es gibt zwei Möglichkeiten um eine Main-Methode zu erstellen: Erste Möglichkeit: extends Application object Obj extends Application{ //content } Diese Möglichkeit ist einfacher zu schreiben, ist aber mit Nachteilen behaftet: ● JVM hat mit dieser Art von Main-Methode Probleme mit Multithreaded Programmen. Zweite Möglichkeit ist ausgeschrieben: object Obj { def main(args: Array[String]) { //content } } ● Einlesen von Kommandozeilenparametern möglich. 30.03.10 Klassen, Methoden und Objekte 12 Imports Einfach Import: ● import java.util.Date ● import java.util._ ( _ ersetzt * ) Man kann in Scala auch Java Bibliotheken benützen. Beispiel: import java.util.Random val rand = new Random(System.currentTimeMillis()); val x = rand.nextInt(10); println(x) 30.03.10 Klassen, Methoden und Objekte 13 Deep Import Deep Import: ● import Rational.CreateRational >> CreateRational(5,2) Importierte Objektmethoden können direkt ausgeführt werden. 30.03.10 Klassen, Methoden und Objekte 14 Basis Typen Typen: Byte, Short, Int, Long, Char, Float, Double, Boolean Groß- oder Kleinschreibung ist egal, von der Scala Community wird aber die Großschreibung bevorzugt. 30.03.10 Klassen, Methoden und Objekte 15 Zahlen Hexadezimal: 0x00FF Octal: 0777 Dezimal: 255 Long: Double: Double: Double: Float: 30.03.10 35L 12.345 3e5 3e5D 1.2345F Klassen, Methoden und Objekte 16 Chars ● Special Chars '\n', '\b', '\t', '\f', '\r', '\“', '\'', '\\' sind alle vorhanden. Standard Unicode Buchstaben aus vier Hexadezimal Ziffern sind vorhanden und werden \u eingeleitet: val d = '\u0041' >> d: Char = A ● Unicode Buchstaben können nicht nur in Chars und Strings benützt werden! val B\u0041\u0044 = 1 >> BAD: Int = 1 ● Eine dort zusätzliche Funktion ist der sogenannte RawString. 30.03.10 Klassen, Methoden und Objekte 17 Strings – Rawstring Rawstring ist ein String, der nicht sensibel für spezielle Zeichen und Syntax ist. Beispiel: println("""Hello "World" in Scala""") .stripMargin: println(""" |Hello "World" |In Scala""" .stripMargin) Löscht alle führenden Leerzeichen, als Positionsangabe der ersten Stelle in der Zeile steht das „|“ 30.03.10 Klassen, Methoden und Objekte 18 Prefixes Prefixes sind besondere Methoden, die vor dem eigentlichen Objekt stehen. Diese Methoden können nur aus einem dieser Zeichen bestehen: +,-,!,~ Aufruf erfolgt über "unary_-" bzw. "unary_!" etc. Beispiel: ● -2.0 = (2.0).unary_● def unary_- {number = -number} ● def unary_- : Rational = {new Rational(-numer,denom)} 30.03.10 Klassen, Methoden und Objekte 19 Unary_! Beispiel private class Lamp{ private var on = false def unary_! {on = !on} def isOn() = on } val lamp = new Lamp !lamp println(lamp.isOn()) !lamp println(lamp.isOn()) 30.03.10 Klassen, Methoden und Objekte 20 Java's == vs. Scala's == Scala vergleicht == auf equals Basis und nicht so wie in Java nach Referenzen. Scala: List(1,2,3) == List (1,2,3) >> Boolean = true List(1,2,3) == List(4,5,6) >> Boolean = false 1 == 1.0 >> Boolean = true List(1,2,3) == null >> Boolean = false null == List(1,2,3) >> Boolean = false („he“+“llo“) == „hello“ >> Boolean = true 30.03.10 Java: >> false >> false >> true >> false >> false >> false Klassen, Methoden und Objekte 21 Assoziativität von Operatoren Priorität der Operationen in Scala und Java: 1. */% 2. +3. : 4. =! 5. <> 6. & 7. ^ 8. | 10. all letters 11. all assignment operators 30.03.10 Multiplikationsoperatoren */% Additionsoperatoren +- Verschiebeoperatoren << >> >>> Vergleichsoperatoren < > >= <= instanceof Gleichheitsoperatoren == != Bitoperator Und & Bitoperator exklusives Oder ^ Bitoperator inklusives Oder | logisches Und && logisches Oder || Bedingungsoperator ?: Zuweisungsoperatoren + += -= *= /= %= >>= <<= >>>= &= ^= |= Klassen, Methoden und Objekte 22 Assozivität von Operatoren Es gibt Methoden, die Operationen umdrehen Beispiel: aus a +: b wird b.+:(a) Wenn ein Methodenname mit ":" endet wird die linke Seite auf die rechte ausgeführt. Wenn von mehreren Methoden die Assoziativität umgedreht wird, dann werden diese auch andersherum gruppiert. Beispiel: aus a ::: b ::: c wird a ::: (b ::: c) 30.03.10 Klassen, Methoden und Objekte 23 Rich Wrapper Table 5.4 · Some rich operations: 0 max 5 0 min 5 -2.7 abs -2.7 round 1.5 isInfinity (1.0 / 0) isInfinity 4 to 6 "bob" capitalize "robert" drop 2 30.03.10 5 0 2.7 -3L false true Range(4, 5, 6) "Bob" "bert" * Listen sind aus dem Buch Programming in Scala von Martin Odersky Klassen, Methoden Table 5.5 · Rich wrapper classes Byte Short Int Char String Float Double Boolean und Objekte scala.runtime.RichByte scala.runtime.RichShort scala.runtime.RichInt scala.runtime.RichChar scala.runtime.RichString scala.runtime.RichFloat scala.runtime.RichDouble scala.runtime.RichBoolean 24 Zusammenfassung ● Erstellen von Methoden, Klassen und Objekte ● Basis Typen ● Prefixes ● Java's == vs. Scala's == ● Assozivität und ":" ● Rich Wrapper 30.03.10 Klassen, Methoden und Objekte 25 Ende Quellen: „Programming in Scala“ von Martin Odersky 30.03.10 Klassen, Methoden und Objekte 26