避免在 toString 方法中递归

Avoiding recursion in toString method

这是我在 Java 练习中遇到的巨大问题。所以,我们得到了这个:

public class CyclicEmployee {
    private int age;
    private String name;
    private CyclicEmployee boss;
    private List<CyclicEmployee> subordinate
}

我们的目标是通过切割可能导致递归无限的字段来覆盖 toString 方法。最后,它应该看起来像一个带有姓名、年龄、老板和下属的打印对象。

Employee[age=30,name='Mike',boss=Employee[age=45,name='Ann'], subordinate=[Employee[age=25,name='Jimmy']]]

好吧,我试过了,发现我不知道如何处理 toString 覆盖:

import java.util.ArrayList;
import java.util.List;

public class CyclicEmployee {
    private int age;
    private String name;
    private CyclicEmployee boss;
    private List<CyclicEmployee> subordinate ;

public CyclicEmployee(int age, String name) {
    this.age=age;
    this.name=name;
}

public static void main(String[] args) {
  CyclicEmployee Mike = new CyclicEmployee(33,"Mike");
  Mike.boss = new CyclicEmployee(44,"Ann");
  Mike.subordinate = new ArrayList<CyclicEmployee>();
  Mike.subordinate.add(new CyclicEmployee(24,"Jim"));
    System.out.println(Mike.toString());
}

@Override
public String toString() {
    return "CyclicEmployee{" +
            "age=" + age +
            ", name='" + name + '\'' +
            ", boss=" + boss +
            ", subordinate=" + subordinate +
            '}';
    }

}CyclicEmployee{age=33, name='Mike', boss=CyclicEmployee{age=44, name='Ann', boss=null, subordinate=null}, subordinate=[CyclicEmployee{age=24, name='Jim', boss=null, subordinate=null}]}

看来我应该把这里的"null"个字段全部删掉,但是我找不到出路

考虑改用 this or this 等现有数据结构。

但是如果你真的想使用你的代码,你可以创建一个 NonCyclicEmployee class

private static class NonCyclicEmployee {

    private int age;
    private String name;

    public NonCyclicEmployee(int age, String name) {
        this.age=age;
        this.name=name;
    }

    @Override
    public String toString() {
        return "CyclicEmployee{" +
            "age=" + age +
            ", name='" + name + '\'' +
            '}';
    }
}

并在 CyclicEmployee 的 toString() 中使用它。

private CyclicEmployee boss;
private List<CyclicEmployee> subordinate ;
private NonCyclicEmployee ncBoss;
private List<NonCyclicEmployee> ncSubordinate ;

@Override
public String toString() {
    return "CyclicEmployee{" +
        "age=" + age +
        ", name='" + name + '\'' +
        ", boss=" + ncBoss +
        ", subordinate=" + ncSubordinate +
        '}';
}

并创建方法 addBoss() 和 addSubordinate() 以同时创建老板(老板和 ncBoss)和下属。

如果我理解正确,您不想打印空 CyclicEmployee 对象。您可以检查 bosssubordinates 是否为空,然后在 toString() 中是否跳过它们。由于它们都是同一类型,因此此方法对它们都适用。

@Override
public String toString() {

String str = "";
str = "CyclicEmployee{" +
    "age=" + age +
    ", name='" + name + '\'';
if (boss != null) {
  str += ", boss=" + boss;
}
if (subordinate.size() != 0) {
  str += ", subordinate=" + subordinate;
}
  str += '}';
return str;
}