Scala Singleton与Java的比较

时间:2014-01-07 14:43:58

标签: java scala

所以我在Scala中理解你不能拥有静态成员,而是使用Singleton(尽管还没有完全得到这个概念)。所以我在Scala中假设这样的代码

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){
            ...
        }
    }
}

我的思维方式是否正确?我正在学习Scala:)

1 个答案:

答案 0 :(得分:4)

这是模糊的正确。由于对象具有不同的类型(并且在技术上并不总是实际的单例),因此它们被编译为单独的类。对象可以与同一包中的类具有相同的名称。这样的对象/类或对象/特征对称为伴侣,并且每个对都可以访问其他私有成员。因此,通过在末尾添加$来修改对象的名称。还有一些特殊的静态转发方法被添加到伴侣类中,所以从Java世界看来,对象成员是该类的静态成员。

对象不是严格总是单例的原因是,如果它们(直接或间接)嵌套在特征或类中,那么该类的每个实例都拥有自己的对象版本,然后有尽可能多的对象对象,因为有封闭特征/类的实例。由于Scala具有路径依赖类型,因此每个对象的类型都与其他对象不同。