2014年10月6日

Classes and Objects in Scala

Scala 特地將 object 從 class 中取出來,讓 object 直接作為 singleton object 的保留字,原本在 Java 中需要透過 Singleton Design Pattern 才能達成的工作,Scala 內建了 singleton object,我們不需要再去了解 Design Pattern,只需要專注在開發 object 內容的工作上。

static method

在 object 中定義可以使用的 method,實際上用起來就像是在 Java 呼叫 static method 一樣。通常我們會在撰寫 Utility 程式中,用到 singleton 與 static method 的想法去實做,畢竟使用公用程式還要先產生物件,會覺得非常麻煩。

object StringUtil {
    def trimHead(s:String) = s.dropWhile(_ == ' ')

    def main(args: Array[String]):Unit = {
        println(StringUtil.trimHead(args(0)))
    }
}

測試

>scala testscala.StringUtil "   test  22 "
test  22

companion object

如果在同一個 scala 檔案中,包含了同樣名字的 class 與 object 兩個定義,在 scala 就稱為 companion object。

class StringUtil {
    val s = "     I am a string in class StringUtil"
}

object StringUtil {
    def trimHead(s: String) = s.dropWhile(_ == ' ')
    def getClassString(): String = {
        val su = new StringUtil()
        trimHead(su.s)
    }

    def main(args: Array[String]): Unit = {
        println(StringUtil.trimHead(args(0)))
        println(StringUtil.getClassString())
    }
}

如果使用 StringUtil.xxx ,實際上是呼叫 singleton object StringUtil,如果是 val su = new StringUtil(),實際上是產生了 StringUtil class 的 instance。

因此 su 是沒辦法呼叫 trimHead 這個定義在 object 的 method,而 StringUtil.s 也同樣是沒有辦法使用的。

仔細看一下 companion object,其實就跟定義一個 Java class,裡面寫上幾個 static method/field 完全一樣,scala 明確地用 object 與 class 兩個關鍵字,將 class/object 內部的靜態與一般區塊分開。

對於programmer來說,有了更簡潔的語法,更簡短的程式碼,又不需要了解 Singleton Design Pattern,整體來說,有什麼道理,不該繼續往 scala 前進呢?

Scala IDE in Eclipse 4.4 Luna

另外再提供一個資訊,目前 Scala IDE 正式版只能在 Eclipse 4.3 Kepler 上運作,如果是使用 Eclipse 4.4 Luna,則我們得要改用開發版的 Scala IDE。

雖然Scala IDE 4.0.0 Milestone 3在網頁上說可以用在 Eclipse Luna,不過實際上測試後是不行的,必須要使用Scala IDE Lithium (4.0), Nightly版本。