Java 重构代码,使其只包含return语句

Java 重构代码,使其只包含return语句,java,algorithm,refactoring,Java,Algorithm,Refactoring,我试图重构这段代码,使之只有一个return语句,但我似乎不知道该怎么做。我正在树中搜索特定节点。树中的每个节点都可以有子节点。如有任何指示,将不胜感激 private TreeNode getDefaultNode(List list, String supervisingGroupName){ for (int i = 0; i < list.size(); i++){ TreeNode tempNode = (TreeNode) list.get(i);

我试图重构这段代码,使之只有一个return语句,但我似乎不知道该怎么做。我正在树中搜索特定节点。树中的每个节点都可以有子节点。如有任何指示,将不胜感激

private TreeNode getDefaultNode(List list, String supervisingGroupName){

    for (int i = 0; i < list.size(); i++){
        TreeNode tempNode = (TreeNode) list.get(i);
        OSGroup temp = (OSGroup) tempNode.getNodeBusinessObject();

        if (supervisingGroupName.equals(temp.getName())){
            return tempNode;
        }
        else {
            TreeNode node = getDefaultNode(tempNode.getChildren(), supervisingGroupName);
            if (node != null){
                return node;
            }
        }

    }

    return null;
}
私有树节点getDefaultNode(列表、字符串管理组名){
对于(int i=0;i
您可以执行以下操作:

private TreeNode getDefaultNode(List list, String supervisingGroupName){
TreeNode node = null;
    for (int i = 0; i < list.size(); i++){
        TreeNode tempNode = (TreeNode) list.get(i);
        OSGroup temp = (OSGroup) tempNode.getNodeBusinessObject();
        if (supervisingGroupName.equals(temp.getName())){
            node = tempNode;
            break;
        }else {
            node = getDefaultNode(tempNode.getChildren(), supervisingGroupName);
            if (node != null){
                break;
            }
        }
    }
    return node;
}
私有树节点getDefaultNode(列表、字符串管理组名){
TreeNode=null;
对于(int i=0;i
您可以使用
break
关键字中断for循环:

private TreeNode getDefaultNode(List list, String supervisingGroupName){
    TreeNode node = null;
    for (int i = 0; i < list.size(); i++){
        node = (TreeNode) list.get(i);
        OSGroup temp = (OSGroup) node.getNodeBusinessObject();

        if (supervisingGroupName.equals(temp.getName())){
            break;
        } else {
            node = getDefaultNode(tempNode.getChildren(), supervisingGroupName);
            if (node != null){
                break;
            }
        }

    }

    return node;
}
私有树节点getDefaultNode(列表、字符串管理组名){
TreeNode=null;
对于(int i=0;i

通过这种方式,您可以重构为一个返回语句,尽管我似乎不再清楚这一点。重构之前,您的代码没有任何问题。

我不建议一次返回;检查名称是否匹配的初始检查是有意义的,并且是清楚的,最后的null返回本身就很好地支持。我想对代码做一点修改,通过消除
else
,来降低代码的表面复杂性——在返回后,不需要在else子句中添加后面的内容,因为当然,只有当返回没有发生时才会发生。我还建议使用类型化列表,以便您可以使用“for each”循环而不是计数循环进行迭代:

private TreeNode getNodeByName(List<TreeNode> nodes, String name) {
    for (TreeNode node: nodes) {
        OSGroup group = (OSGroup) node.getNodeBusinessObject();
        if (name.equals(group.getName())){
            return node;
        }

        TreeNode child = getNodeByName(node.getChildren(), name);
        if (child != null) {
            return child;
        }
    }
    return null;
}
private树节点getNodeByName(列出节点,字符串名称){
用于(TreeNode节点:节点){
OSGroup=(OSGroup)节点。getNodeBusinessObject();
if(name.equals(group.getName())){
返回节点;
}
TreeNode child=getNodeByName(node.getChildren(),name);
if(child!=null){
返回儿童;
}
}
返回null;
}

你会看到,我也做了相当多的重命名;我认为这些名称使代码更加清晰。

您可以在方法的开头声明
TreeNode节点
,并将其设置为
null
,在
if
else
块中修改它,并在方法的末尾返回它。我可以麻烦您问一下为什么吗?我认为它们可以让方法返回null更具可读性。你可以重构一个返回,但这会让代码更不可读