所以我在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:)
答案 0 :(得分:4)
这是模糊的正确。由于对象具有不同的类型(并且在技术上并不总是实际的单例),因此它们被编译为单独的类。对象可以与同一包中的类具有相同的名称。这样的对象/类或对象/特征对称为伴侣,并且每个对都可以访问其他私有成员。因此,通过在末尾添加$
来修改对象的名称。还有一些特殊的静态转发方法被添加到伴侣类中,所以从Java世界看来,对象成员是该类的静态成员。
对象不是严格总是单例的原因是,如果它们(直接或间接)嵌套在特征或类中,那么该类的每个实例都拥有自己的对象版本,然后有尽可能多的对象对象,因为有封闭特征/类的实例。由于Scala具有路径依赖类型,因此每个对象的类型都与其他对象不同。