我正在编写一个二叉树类。我想避免
null
值,因此我决定使用指定值 nil
。因此,当某个元素没有左子元素时,我将使用 n.left = null
,而不是 n.left = nil
。但是,我需要指定 nil
的左孩子和右孩子,唯一的选择是 nil
本身。所以,我想写这个:
class Node(val left: Node, val right: Node) {
companion object {
val nil = Node(nil, nil)
}
}
或者至多:
class Node(val left: Node, val right: Node) {
private constructor(): this(this, this)
companion object {
val nil = Node()
}
}
当然,那些不能编译。这是我被迫写的:
class Node {
val left: Node
val right: Node
constructor(left: Node, right: Node) {
this.left = left
this.right = right
}
private constructor() {
this.left = this
this.right = this
}
companion object {
val nil = Node()
}
}
它有更多的代码,特别是在我添加更多字段之后。有什么办法可以简洁地写这个吗?
如果你想避免可空类型,那么也许这样的东西适合你:
sealed interface Node {
val left: Node
val right: Node
}
object EmptyNode : Node {
override val left: EmptyNode get() = this
override val right: EmptyNode get() = this
}
class RegularNode(
override val left: Node = EmptyNode,
override val right: Node = EmptyNode,
) : Node
但是它需要您为添加到
Node
接口的每个属性和函数更新两个实现。尽管您可以尽可能使用扩展功能。