我目前有一个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,因为我不希望在所有对象之后打印出来?我还想确保这些对象中的每一个都按照它们当前的单独行打印,所以请不要建议包含一个长连接字符串而不包含换行符的解决方案,因为这不适合这种情况。
提前致谢!
答案 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
),并且会这样做。