加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:36:57 所属栏目:Java 来源:网络整理
导读:我不得不在 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
我不得不在 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 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)会识别出这个并且内联方法调用,如果这样做有利的话.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读