0

我目前有一个 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 的最佳方法是什么,因为我不希望在所有对象之后打印出来?我还想确保这些对象中的每一个都像现在一样打印在单独的行上,所以请不要建议包含一个没有换行符的长连接字符串的解决方案,因为这不适合这种情况。

提前致谢!

4

3 回答 3

7

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

相反,构建并返回一个字符串(可能使用 a 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.

于 2014-01-17T22:25:04.500 回答
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"换行符,因此您可以在不同的行中打印每个“部分结果”。

于 2014-01-17T22:24:36.650 回答
-1

你在你的问题中说:

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

那么你可能不应该使用toString(); 那不是它的用途。它用于返回作为对象的某种表示形式的单个字符串。它永远不应该输出任何东西。

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

于 2014-01-17T22:32:41.897 回答