子类与容器

时间:2014-12-14 03:59:45

标签: scala

Actor类将Node定义为:

class Node[A](val a: A) extends AtomicReference[Node[A]]

创建像这样的链接列表是一种好习惯吗?与

相比有什么优势
class Node[A](val a: A, val prev: AtomicReference[Node[A]])

前者肯定更短,但IMO因为混合了两个实体而不太可读。

1 个答案:

答案 0 :(得分:2)

使用模式更简洁。通过扩展AtomicReference,scalaz可以直接在每个节点上使用原子调用。

Actor.scala的一个示例方法:

def !(a: A): Unit = {
    val n = new Node(a)
    val h = head.getAndSet(n)
    if (h ne null) h.lazySet(n)
    else schedule(n)
}

相同的代码,包含您的变体:

def !(a: A): Unit = {
    val n = new Node(a, new AtomicReference[Node[A]])
    val h = head.prev.getAndSet(n)
    if (h ne null) h.prev.lazySet(n)
    else schedule(n)
}