使用toString方法和每个循环打印对象时要返回什么?

时间:2014-01-17 22:22:40

标签: java arraylist foreach tostring object-to-string

我目前有一个toString方法,类似于下面的方法。请忽略对象仅被临时命名。我这样做是为了使每个变量的类型之间没有混淆等。:

@Override
public String toString() {
    for(Object object : ArrayList) {
        System.out.println("This object is a " + object.getVariableA() + " and a " + object.getVariableB() + ".");
    }
    return null;
}

但是toString方法要求我返回一个值。我显然只想返回我正在打印的字符串,虽然如果我在那里放置一个返回语句,它只会打印一个Object而不是所有我正在循环的对象。什么是打印所有这些值的最佳方法,而不是简单地返回null,因为我不希望在所有对象之后打印出来?我还想确保这些对象中的每一个都按照它们当前的单独行打印,所以请不要建议包含一个长连接字符串而不包含换行符的解决方案,因为这不适合这种情况。

提前致谢!

3 个答案:

答案 0 :(得分:7)

toString不应输出任何 。它的工作是返回相关对象的适当字符串表示,而不是输出任何地方的表示。这不在问题领域。

相反,构建并返回一个字符串(可能使用StringBuilder)。

,例如:

@Override
public String toString() {
    StringBuilder sb = new StringBuilder(some_appropriate_size);
    for(Object object : ArrayList) {
        sb.append("This object is a ")
          .append(object.getVariableA())
          .append(" and a ")
          .append(object.getVariableB())
          .append(".\n");
    }
    return sb.toString();
}
  

我还想确保这些对象中的每一个都打印在当前的单独行上,所以请不要建议包含一个长连接字符串的解决方案,因为这不适合这种情况。

上面将数组列表中的项放在单独的“行”上(通过\n)。但是“一个长期加入的字符串”是toString要做的唯一适当的事情。如果您想要不同的结果,则必须使用其他方法,而不是违反toString的合同。

答案 1 :(得分:3)

您可以创建String并添加您希望每次迭代的内容:

@Override
public String toString() {
    String result = "";
    for(Object object : ArrayList) {
        result += "This object is a " + object.getVariableA() + " and a " + object.getVariableB() + ".\n");
    }
    return result;
}

不要忘记添加"\n"换行符,以便在一个不同的行中打印每个“部分结果”。

答案 2 :(得分:-1)

您在问题中说明:

  

我还想确保这些对象中的每一个都打印在当前的单独行上,所以请不要建议包含一个长连接字符串的解决方案,因为这不适合这种情况。

然后你可能不应该使用toString();这不是它的用途。它用于返回单个字符串,该字符串是对象的某种表示形式。它应该从不输出任何东西。

在您的类中添加一个getter,它返回List个对象,并根据需要输出它们。如果您真的想让该类自行打印,请添加print(OutputStream os)方法,该方法采用提供的OutputStream(或者可能是PrintStream),并且会这样做。