Java’cılar Için Scala – 3 [OOP]
Scala ile hem functional hem de OOP özelliklerini kullanabilirsiniz. OOP önemli bir kavram, bu kavramın detaylarına değinmeden Scala’daki karşılığını anlamayaca çalışacağız.
Önceki yazılara aşağıdaki linklerden ulaşabilirsiniz.
Java’cılar için Scala -1 Temel
Java’cılar için Scala-2 Collections
Bazı kavramları örnek bir projeye ekleme yaparak ilerleyeceğiz.
Burada da en temel yapımız class‘lar. Student, Lesson ve Teacher class’ları oluşturacağız ve konularımızı bu class’lar üzerinden örneklendireceğiz.
1 2 3 4 5 6 7 8 9 10 11 |
class Teacher { var name: String = null var surname: String = null var age: Int = 0 } |
Burada iki önemli nokta var. Birincisi access modifier belirtmedik ve Scala’da belirtmezseniz default’da public‘tir. İkincisi ise değişkenlere ilk değer ataması zorunlu.
Primary Constructor
1 2 3 4 5 6 7 |
class Teacher (name: String ){ } |
Scala’da yukarıdaki gibi constructor tanımları primary constructor olarak geçiyor. Aslında parametre alan bir method gibi sınıf tanımında karşımıza çıkıyor. Primary constructor boş da olabilir parametre de alabilir.
Auxiliary Constructor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Teacher (name: String ){ var surname: String = null var age: Int = 0 def this(name: String, surname: String) = { this(name) this.surname = surname } def this(name: String, surname: String, age:Int) = { this(name,surname) this.age = age } } |
Aslında temelde yaptığımız constructor overloading.
Kalıtım ( Inheritance)
Java’da olduğu gibi extends key word’ü ile kalıtımı gerçekleştirebilirsiniz.
Final Kullanımı
Java’da daha olduğu gibi final ile class method ve properties seviyesinde kullanabilirsiniz. Aynı özellikler burada da geçerli.
- final class extends edilemez.
- final method override edilemez.
- final properities ise değerini değiştiremezsiniz.
Trait
Trait hem soyut hem de somut methodlar içerebilir. Somut methodtan kastımız tabii ki metodun gövdesi olması. Böyle belirtince aklınıza abstract class aklınıza gelebilir kaldı ki hatta Java 8 ile de interface’lerde benzer bir yapı sağlanabilir. Buradaki en önemli farklı çoklu kalıtım ve bu özellik sadece trait’ler sağlanması.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
trait TraitClass { def concretMethod(): Unit ={ // } def abstractMethod() : Unit def abstractMethod2(str : String) : String } |
Ayrıca şu bilgimizi de hatırlamakta fayda var. Kalıtım yoluyla aldığımız soyut methodları alt class’lar gerçeklemek durumundadır.
Diğer bir nokta ise çoklu kalıtımda Java’da birden fazla interface’den kalıtım sağlayabiliriz ve bunu yaparken virgül(class A implements B, C) kullanıyoruz. Burada ise with key word’ü ile bu işlemi gerçekleştirebiliyoruz. (Bence çok mantıklı :D)
Case Class
case key word’ünü ilk bölümde switch case yapısında görmüştük. Burada da benzer şekilde kullanılabilir. Ayrıca aşağıdaki gibi class oluşturduğunuzda new ile bir instance oluşturmanıza gerek yoktur.
1 2 3 4 5 |
case class Developer(name : String, surname: String, age: Int) |
1 2 3 4 5 6 7 8 9 10 |
var developer1 = Developer("cem","dirman",27) var developer2 = Developer("eren","sakarya",27) val developer3: Developer = Developer("buğra","tiritoğlu",27) val developer4: Developer = new Developer("hasan","pekmez",27) println(developer1.name) |
class tanımında gördüğümüz üzere var ya da val olduğunu belirtmedik. default olarak val tanımlıdır ve class’ın elemanları olduğu için özelliklerine de ulaşabiliriz. Bu sayede boilerplate kodu azaltmış oluyoruz.
Faydalı olması dileğiyle.