gpt4 book ai didi

java - 如何重构执行类似操作的 if-else 主体?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:22 25 4
gpt4 key购买 nike

我不得不在 java 中为二叉树的节点编写一个类,而且不仅仅是方法有一个问题,即 if-else 语句的主体做了几乎相同的事情。例如:

public void insert(int val) {
if(val < key)
if(left == null)
left = new TreeNode(val, this);
else
left.insert(val);
else
if(right == null)
right = new TreeNode(val, this);
else
right.insert(val);
}

这里代码重复,我想找到一种方法来避免这种代码重复。我想出的唯一解决方案可以在 C++ 中使用,但不能在 Java 中使用。这将在“左”或“右”上创建一个引用,而不是将该引用用于分配。

将其可视化,风格如下:

public void insert(int val) {
TreeNode direction = right;
if(val < key)
direction = left;

if(direction == null)
!! direction = new TreeNode(val, this); !!
else
direction.insert(val);
}

带前导和尾随的行!!由于引用语义在 java 中的工作方式,因此无法工作。如前所述,在 C++ 中,我只需在左侧或右侧引用上创建一个引用并对其进行处理。

有没有办法不用重复的代码就可以用java写这段代码?在更复杂的情况下,我可能会再次遇到这个问题,现在我想知道如何解决它,因为恕我直言,它带来了更好的可维护代码。

最佳答案

我会创建一个可重用的私有(private)方法来隔离重复的逻辑:

private TreeNode handleNode(TreeNode node, int val) {
if(node == null)
node = new TreeNode(val, this);
else
node.insert(val);
return node;
}

然后

public void insert(int val) {
if(val < key)
left = handleNode(left, val);
else
right = handleNode(right, val);
}

正如您所说,这个特定示例相当小,但即使在这里,这种模式也很有用,当然当被隔离/分解的逻辑更复杂时。

如果您担心方法调用的开销,请不要担心。方法调用真的非常便宜。 :-) 如果这是代码中的热点,现代 JVM(如 Oracle 的)会识别它并内联方法调用,如果这样做有好处的话。

关于java - 如何重构执行类似操作的 if-else 主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40958946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com