我有一些课程C:
class C (...) { ... }
我想用它来索引有效的地图。最有效的地图是阵列。 所以我在伴随对象中添加了一个“全局”“静态”计数器,为每个对象提供唯一的id:
object C {
var id_counter = 0
}
在C的主要构造函数中,每次创建C我想要 记住全球计数器值并增加它 问题1:怎么做?
现在我可以在C对象中使用id作为索引数组的完美哈希。 但是数组不保留像map那样的类型信息,给定的数组是由C的id索引的。
问题2:是否可以使用类型安全?
更新
问题2中的类型安全涉及地图索引的类型,以避免混合两个不相关的整数。
课程的价值是(类型)安全..
问题1询问如何在默认构造函数中增加变量?
即:放在哪里?
id_counter += 1
答案 0 :(得分:1)
我没有看到问题。我可能会将计数器设为私有,因此class
和object
C
之外的代码无法改变它。增加var
类型Int
是微不足道的:
idCounter += 1
数组在Scala中是类型安全的,因为它们是由JVM数组直接实现的(从2.8开始)。
我怀疑我并不是真的明白你的问题......
<强>更新强>
大概是在构造函数中增加计数器。
至于创建一个真正完美的哈希函数,我认为你并没有真正走上正轨。 (您只是将映射从您的实际密钥推送到您自己的代码中。)您应该阅读有关创建最小和/或完美哈希函数的技术。
答案 1 :(得分:1)
回答你的问题2:
case class C_Id(val asInt: Int)
object C {
private var list: ArrayBuffer[C]
// resizable array in scala.collection.mutable
// you can also use ArrayList
def apply(id: C_Id) = list(id.asInt) // only accepts an id of C
...
}
class C (...) {
// in constructor:
list += this
}
编辑问题1:默认构造函数只是类型的主体,但方法和其他构造函数的定义除外。
答案 2 :(得分:0)
您是否可以使用C private的默认构造函数,并在随播对象中提供一个工厂方法(可以轻松处理更新计数器)?