Как вывести объект в читаемом виде
Короткий ответ
Переопределите toString() — его вызывает IO.println() и склейка со строкой:
class Product {
String name = "Tea";
double price = 3.5;
@Override
public String toString() {
return name + " (" + price + " €)";
}
}
void main() {
IO.println(new Product());
IO.println("Item: " + new Product());
}Результат:
Tea (3.5 €)
Item: Tea (3.5 €)Записи
У записей toString() уже есть: он показывает имя типа и все поля:
record User(String name, int age) {}
void main() {
IO.println(new User("Anna", 30));
}Результат:
User[name=Anna, age=30]Скрыть секретные поля
Пароли и токены не должны попадать в логи. Переопределите toString() у записи:
record Credentials(String login, String password) {
@Override
public String toString() {
return "Credentials[login=" + login + ", password=***]";
}
}
void main() {
IO.println(new Credentials("anna", "s3cret"));
}Результат:
Credentials[login=anna, password=***]Частая ошибка
Не переопределить toString(). Тогда выводится имя класса и хеш-код, которые ничего не говорят:
class Product {
String name = "Tea";
}
void main() {
IO.println(new Product());
}Результат:
Main$Product@2698dc7Число после @ у вас будет другим.
Функции из этого ответа
- Object.toString() — Возвращает текстовое представление объекта; вызывается при выводе и сложении со строкой.
- record — Объявляет запись — неизменяемый класс для хранения данных с готовыми equals(), hashCode() и toString().
- Arrays.toString() — Возвращает содержимое массива в виде строки [1, 2, 3].