Что возвращать при распечатке объектов с использованием метода toString и a для каждого цикла?
В настоящее время у меня есть метод 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, он напечатает только один объект, а не все те, через которые я зацикливаюсь. Что было бы лучшим способом напечатать все эти значения, а не просто вернуть ноль, так как я не хочу, чтобы эта печать распечатывалась после всех объектов? Я также хочу убедиться, что каждый из этих объектов напечатан на отдельных строках, как в настоящее время, поэтому, пожалуйста, не предлагайте решения, которые включают одну длинную строку без разрывов строк, так как это не подходит в этой ситуации.
Заранее спасибо!
3 ответа
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
,
Вы могли бы создать 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"
символ новой строки, поэтому вы печатаете каждый "частичный результат" одной отдельной строкой.
Вы заявляете в своем вопросе, что:
Я также хочу убедиться, что каждый из этих объектов напечатан на отдельных строках, как в настоящее время, поэтому, пожалуйста, не предлагайте решения, которые включают одну длинную строку, так как это не подходит в этой ситуации.
Тогда вы, вероятно, не должны использовать toString()
; это не то, для чего это. Это для возвращения единственной строки, которая является некоторым представлением объекта. Он никогда не должен ничего выводить.
Добавьте в свой класс метод получения, который возвращает List
объектов, выведите их, как вы хотели бы. Если вы действительно хотите сделать самопечатание класса, добавьте print(OutputStream os)
метод, который принимает поставленный OutputStream
(или может быть PrintStream
вместо) и будет делать это.