我在写一个二叉树类。我想避免null
值,我决定使用指定值nil
。所以,当一个元素没有左子元素时,我有n.left = nil
而不是n.left = null
。但是,我需要为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()
}
}
它有更多的代码,特别是在我添加了更多的字段之后。有什么方法可以写得简洁一点吗?
1条答案
按热度按时间9udxz4iz1#
?.
)和elvis(?:
)操作符,并有智能转换,可以检查null。如果你想避免可空类型,那么也许像这样的东西对你有用:
但是它需要您为添加到
Node
接口的每个属性和函数更新两个实现。如果可能的话,你可以使用扩展函数。也就是说,我假设您将向
Node
添加value
属性。考虑到您的用例的性质,这个属性必须是通用的。这使得事情变得更加困难,尽管你可以尝试这样的事情:但是注意现在
EmptyNode
不是单例。