Java 使用toString方法和for-each循环打印对象时返回什么?

Java 使用toString方法和for-each循环打印对象时返回什么?,java,arraylist,foreach,tostring,object-to-string,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() + ".");

我目前有一个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方法要求我返回一个值。很明显,我只想返回我正在打印的字符串,尽管如果我在其中放置一个return语句,它将只打印一个对象,而不是我正在循环的所有对象。打印所有这些值,而不是简单地返回null,因为我不希望在所有对象之后打印出来,最好的方法是什么?我还想确保这些对象中的每一个都像当前一样打印在单独的行上,因此请不要建议包含一个没有换行的长连接字符串的解决方案,因为这不适合这种情况

提前谢谢

您可以创建一个字符串,并在每次迭代中添加所需内容:

@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新行字符,以便在不同的行中打印每个部分结果。

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();
}
我还想确保每个对象都像当前一样打印在单独的行上,因此请不要建议包含一个长连接字符串的解决方案,因为这不适合这种情况


上面通过将数组列表中的项放在单独的行上。但是一个长连接的字符串是toString唯一适合做的事情。如果你想得到不同的结果,你必须使用不同的方法,而不是破坏toString的契约。

你在问题中陈述:

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

那么您可能不应该使用toString;那不是它的目的。它用于返回作为对象表示形式的单个字符串。它不应该输出任何东西


向类中添加一个getter以返回对象列表,并根据需要输出它们。如果您真的想让类自打印,请添加一个printOutputStream os方法,该方法接受提供的OutputStream,或者可能是一个PrintStream,并将这样做

s/String/StringBuilder/toString应该返回一个包含对象描述的字符串。它不应该打印任何东西。阅读Object.toString的javadoc。@JBNizet这是我最初的评论,但后来意识到OP只是演示了他们想要返回的内容。也就是说。。。所以请不要建议包含一个长连接字符串的解决方案。。。好的,那么是的,你做错了+1你在附加中进行字符串连接:将调用链接到append会更有效。@zouzu:没错。谢谢@T.J.Crowder,这是一个很好的解决方案。尽管目前StringBuilder在最后一个打印的字符串上添加了一行新行,但并不需要这样做。如何确保最后一个字符串不会以新行结尾?@edwoollard:有很多方法。例如,您可以在循环之后添加sb.deleteCharAtsb.length。或使用。在最后一次追加中,有一个变量用于第一次追加,该变量最初包含的对象是a,但在追加后的第一个循环中设置为\n该对象是a。或者有一个标志,boolean first=true;并在循环的开头使用if first{first=false;}else{sb.append\n;}。或者…我编辑了我的问题来重新措辞。我确实想返回一个字符串,但我想确保人们理解我希望返回多行。我想我可能会找到一个非常长的字符串的解决方案,因为有很多内容要显示,因此在我的示例中不实用。即使如此,听起来你并没有按照预期使用toString。我完全满足于使用一个StringBuilder并从toString方法返回它,所以是的,我是按照预期的方式使用它的。这就是为什么我一开始就提出了关于StackOverflow的问题。