Фон
Все объекты Java имеют метод toString()
, который вызывается при попытке распечатать объект.
System.out.println(myObject); // invokes myObject.toString()
Этот метод определен в классе Object
( суперкласс всех объектов Java). Метод Object.toString()
возвращает довольно уродливая строка, состоящая из имени класса, символа @
и хэш-код объекта в шестнадцатеричном формате. Код для этого выглядит так:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Таким образом, такой результат, как com.foo.MyType@2f92e0f4
, можно объяснить следующим образом:
com.foo.MyType
- имя класса, т.е. класс MyType
в пакете com.foo
.
@
- соединяет строку вместе
2f92e0f4
хэш-код объекта.
Название классов массива выглядит немного иначе, что хорошо объясняется в документации Javadocs для _ 13_. Например, [Ljava.lang.String
означает:
[
- одномерный массив (в отличие от [[
или [[[
и т. Д.)
L
- массив содержит класс или интерфейс
java.lang.String
- тип объектов в массиве
Настройка вывода
Чтобы напечатать что-то другое при вызове System.out.println(myObject)
, вы должны переопределить toString()
в вашем собственном классе. Вот простой пример:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
Теперь, если мы напечатаем Person
, мы увидим их имя, а не com.foo.Person@12345678
.
Помните, что toString()
- это всего лишь один способ преобразования объекта в строку. Обычно этот вывод должен полностью описывать ваш объект в ясной и лаконичной манере. Лучшим toString()
для нашего Person
класса может быть:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
Что напечатает, например, Person[name=Henry]
. Это действительно полезный фрагмент данных для отладки / тестирования.
Если вы хотите сосредоточиться только на одном аспекте вашего объекта или включить много джазового форматирования, вам может быть лучше вместо этого определить отдельный метод, например String toElegantReport() {...}
.
Автоматическое создание вывода
Многие IDE предлагают поддержку автоматического создания toString()
метода на основе полей в классе. См. Документацию по Eclipse и, например, IntelliJ.
Несколько популярных библиотек Java также предлагают эту функцию. Вот некоторые примеры:
Печать групп объектов
Итак, вы создали красивый toString()
для своего класса. Что произойдет, если этот класс поместить в массив или коллекцию?
Массивы
Если у вас есть массив объектов, вы можете вызвать _ 36_ для создания простого представления содержимого массива. Например, рассмотрим этот массив из Person
объектов:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Примечание: это вызов статического метода, называемого toString()
в классе Arrays, который отличается от того, что мы обсуждали выше.
Если у вас есть многомерный массив, вы можете использовать _ 40_, чтобы получить такой же результат.
Коллекции
Большинство коллекций будут производить красивый результат, основанный на вызове .toString()
для каждого элемента.
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Поэтому вам просто нужно убедиться, что элементы вашего списка определяют красивый toString()
, как обсуждалось выше.
person
Duncan Jones
schedule
19.03.2015