scala.Symbol 的一个问题似乎是它有两个对象,Symbol 和它所基于的 String。
为什么不能通过定义 Sym 来消除这个额外的对象:
class Sym private(val name:String) extends AnyVal {
override def toString = "'" + name
}
object Sym {
def apply(name:String) = new Sym(name.intern)
}
诚然,对象分配对性能的影响可能很小,但那些对 Scala 有更深入了解的人的评论会很有启发性。特别是,上面是否通过引用相等提供了有效的映射?
上面简单的“Sym”的另一个优点是在一个以地图为中心的应用程序中,其中有很多字符串键,但在字符串命名许多完全不同类型的事物的情况下,可以定义类型安全的 Sym 类,以便地图明确显示程序员、编译器和重构工具真正的关键是什么。
(Symbol 和 Sym 都不能扩展,前者显然是可以选择的,后者是因为它扩展了 AnyVal,但 Sym 很简单,只需用适当的名称进行复制)