2014-01-07 58 views
2

所以我明白在Scala中你不能擁有靜態成員,而是我們使用一個Singleton(儘管如此,還沒有完全理解這個概念)。所以我假設這樣的代碼在斯卡拉Scala Singleton與Java的比較

import scala.collection.mutable.Map 
//Making use of Singleton: companion Object & Class 

class CheckSumAccumulator { 
    private var sum = 0 
    def add(b: Byte) { sum += b } 
    def checksum(): Int = ~(sum & 0xFF) + 1 
} 

object CheckSumAccumulator{ 
    private val cache = Map[String, Int]() 

    def calc(s: String): Int = 
    if (cache.contains(s)) 
     cache(s) 
    else { 
     val acc = new CheckSumAccumulator 
     for (c <- s) 
     acc.add(c.toByte) 
     val cs = acc.checksum() 
     cache += (s -> cs) 
     cs 
    } 
} 

將在Java中這樣的等價物:

public class CheckSumAccumulator { 
    private var sum = 0 
    static void add(byte b){ 
     ... 
    } 

    static int checksum(){ 
     ... 
    } 

    public static void main (String [] args){ 
     private val cache = ... 

     def calc(String s){ 
      ... 
     } 
    } 
} 

我是正確的思維方式?我正在學習斯卡拉:)

回答

4

這是隱約正確的。由於對象具有不同的類型(並且在技術上不總是實際的單例),因此它們會被編譯爲一個單獨的類。對象可以與同一個包中的類具有相同的名稱。這種對象/類或對象/特徵對稱爲同伴,並且每個對都可以訪問其他的私有成員。因此,通過添加$來最終增加對象的名稱。還有一些特殊的靜態轉發方法被添加到伴侶類中,所以從Java世界看來,對象成員是類的靜態成員。

原因對象並不嚴格總是單身的是,如果它們嵌套(直接或間接)在特徵或類中,那麼該類的每個實例都承載它自己的對象版本,然後有許多這些對象是封閉特質/類的實例。因爲Scala具有路徑依賴類型,所以這些對象中的每一個都具有與其他類型不同的類型。