Фон
Усі об'єкти 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 для Class.getName()
. Наприклад, [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()
для свого класу. Що станеться, якщо цей клас помістити у масив чи колекцію?
Масиви
Якщо у вас є масив об'єктів, ви можете зателефонувати, Arrays.toString()
щоб створити просте зображення вмісту масиву. Наприклад, розглянемо цей масив Person
об'єктів:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Примітка. Це виклик статичного методу, який називається toString()
в класі Arrays, який відрізняється від того, про який ми говорили вище.
Якщо у вас є багатовимірний масив , ви можете використовувати Arrays.deepToString()
для досягнення одного виду вихід.
Колекції
Більшість колекцій дають неабиякий вихід на основі виклику .toString()
кожного елемента.
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Тому вам просто потрібно забезпечити, щоб елементи списку визначали приємне, toString()
як обговорювалося вище.