Kotlin - 将“this”作为构造函数参数传递

问题描述 投票:0回答:1

我正在编写一个二叉树类。我想避免

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()
    }
}

它有更多的代码,特别是在我添加更多字段之后。有什么办法可以简洁地写这个吗?

kotlin constructor
1个回答
0
投票

如果你想避免可空类型,那么也许这样的东西适合你:

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
接口的每个属性和函数更新两个实现。尽管您可以尽可能使用扩展功能。

© www.soinside.com 2019 - 2024. All rights reserved.