Actor类将Node
定义为:
class Node[A](val a: A) extends AtomicReference[Node[A]]
创建像这样的链接列表是一种好习惯吗?与
相比有什么优势class Node[A](val a: A, val prev: AtomicReference[Node[A]])
前者肯定更短,但IMO因为混合了两个实体而不太可读。
答案 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)
}