Merhabalar. Scala’ya Giriş yazısında Scala’nın ne olduğundan bahsetmiştik ve Hello World uygulamamızı yapmıştık. Bu yazıda da Unified Types konusuna değineceğiz.

Önceki yazıda da değindiğim gibi Scala’da primitive tip-nesne ayrımı yoktur. Scala’da her şey nesnedir. Scala mimarisi sınıf tabanlı olmasından ötürü de tüm değerler bir sınıf instance’dır.

Scala Class Hierarchy

Yukarıdaki resim Scala dilinin sınıf hiyerarşisini anlatıyor. Scala’da en üst sınıf yani tüm sınıfların atası scala.Any sınıfıdır. scala.Any iki alt sınıfa sahiptir. scala.AnyVal ve scala.AnyRef. scala.AnyVal sınıfı Java’daki primitive tiplere karşılık gelen değerlerin yer aldığı sınıfları kendi altında tutar. Buradaki sınıflar tipinde olabilecek verile ön tanımlıdır. Yani bir number, bir boolean değer ön tanımlı olarak bize gelir ve bunlar da object’tir. scala.AnyRef ise diğer tüm sınıfları altına toplayan bir sınıftır. Scala ile kod yazarken bizim tanımlayacağımız sınıflar da scala.AnyRef altındaki scala.ScalaObject sınıfını extend ederek oluşur. Scala’yı biz JRE üzerinde çalıştırdığımız için scala.AnyRef sınıfı aslında java.lang.Object sınıfına karşılık gelmektedir.

Ayrıca yukarıdaki diyagramdan göreceğimiz bir şey de şudur ki scala.AnyVal atındaki sınıflar arasındaki dönüşümler otomatik olarak Scala içinde gerçekleşiyor.

Scala dili 1 + 2 * 3 / x artimetik işlemini her şeyi obje olarak gördüğünden (1).+(((2).*(3))./(x)) ifadesine çevirip işlemini yapar.

Şimdi basit bir örnek yapalım.

Önceki yazıda sağ tıklayıp Object eklediğimiz gibi şimdi de App isminde Class ekleyin projenize ve içeriğini sadece main metodunu barındıracak şu şekilde düzenleyin:

App.scala

package com.ilkaygunel.scalatutorials

class App {
def main(args: Array[String]): Unit = {
    
  }
}

Şimdi de bir object ekleyin ve içeriğini şöyle değiştirin:

UnifiedTypes.scala

package com.ilkaygunel.scalatutorials

object UnifiedTypes extends App{
val set = new scala.collection.mutable.LinkedHashSet[Any]
  set += "This is a string"  // add a string
  set += 732                 // add a number
  set += 'c'                 // add a character
  set += true                // add a boolean value
  set += main _              // add the main function
  val iter: Iterator[Any] = set.iterator
  while (iter.hasNext) {
    println(iter.next.toString())
  }
}

UnifiedTypes object’ini ilk olarak main metodu barındıran App sınıfından kalıtıyoruz. İçerisinde ise Java’daki Set interface’ine benzer bir set tanımlıyoruz. Set’in tutacağı değer tipleri için yukarıdaki diyagramın en tepesinde gördüğümüz Any sınıfını kullanıyoruz. Bu set’e += ifadeleri ile değerler ekliyoruz. Eklediğimiz değerlere dikkat edersek String, number, karakter, boolean ve fonksiyon tipindeki değerler yer alıyor. Hepsi de Any sınıfından dolayı sorunsuzca set’e eklenebiliyor ve bunların her birisi Scala için bir nesne.

Örneğin Java dili için 732 integer bir değerken, true boolean bir değerken yani ikisi de primitive bir değerken Scala için ikisi de object’tir. 732 değeri Scala’daki Int sınıfından türerken Java’daki en tabandaki primitive int gibi çalışır fakat yaptığı iş Int sınıfı üzerinden türemektir. Keza true değeri de burada Java’daki primitive tip gibi kullanılabilirken aslında scala.Boolean sınıfından türeyerek kullanılıyor.

val iter: Iterator[Any] = set.iterator ifadesi ile Any sınıfı tipinde değerler üzerinde dönecek bir Iterator sınıfından bir nesne tanımlayıp bu set nesnesinden alınan iterator ile iter nesnesi oluşturuyoruz. Akabinde while döngüsü ile de set içinde dönüyoruz.

UndefinedTypes’ı çalıştırdığımızda konsol çıktımız şöyle oluyor:

Bu yazıda anlatacaklarım da bu kadar arkadaşlar. Basitçe Scala’da sınıf hiyerarşisine değinmiş olduk. Gelecek yazıda görüşene kadar sağlıcakla kalın.

Selam ve Sevgilerimle

NOT: Diyagramın alındığı kaynak: http://1.bp.blogspot.com/-is7hpMTwGkc/VS6gzAxOQfI/AAAAAAAADPk/zmkBv7GlTo4/s1600/class-hierarchy.png