toString () возвращает строковое / текстовое представление объекта.
Обычно используемый для диагностических целей, таких как отладка, ведение журнала и т. Д., Метод toString () используется для чтения значимых подробностей об объекте.
Он автоматически вызывается, когда объект передается в println, print, printf, String.format (), assert или оператор объединения строк.
Реализация по умолчанию функции toString () в классе Object возвращает строку, состоящую из имени класса этого объекта, за которым следует знак @ и шестнадцатеричное представление без знака хеш-кода этого объекта с использованием следующей логики
getClass().getName() + "@" + Integer.toHexString(hashCode())
Например, следующее
public final class Coordinates {
private final double x;
private final double y;
public Coordinates(double x, double y) {
this.x = x;
this.y = y;
}
public static void main(String[] args) {
Coordinates coordinates = new Coordinates(1, 2);
System.out.println("Bourne's current location - " + coordinates);
}
}
печать
Bourne's current location - Coordinates@addbf1 //concise, but not really useful to the reader
Теперь переопределение toString () в классе Coordinates, как показано ниже,
@Override
public String toString() {
return "(" + x + ", " + y + ")";
}
Результаты в
Bourne's current location - (1.0, 2.0) //concise and informative
Полезность переопределения toString () становится еще больше, когда метод вызывается для коллекций, содержащих ссылки на эти объекты. Например, следующее
public static void main(String[] args) {
Coordinates bourneLocation = new Coordinates(90, 0);
Coordinates bondLocation = new Coordinates(45, 90);
Map<String, Coordinates> locations = new HashMap<String, Coordinates>();
locations.put("Jason Bourne", bourneLocation);
locations.put("James Bond", bondLocation);
System.out.println(locations);
}
печать
{James Bond=(45.0, 90.0), Jason Bourne=(90.0, 0.0)}
вместо этого
{James Bond=Coordinates@addbf1, Jason Bourne=Coordinates@42e816}
Несколько указателей реализации,
- Вы почти всегда должны переопределять метод toString (). Один из случаев, когда переопределение не требуется, - это служебные классы, которые группируют статические служебные методы в виде java. util.Math . Случай, когда переопределение не требуется, довольно интуитивен; почти всегда вы бы знали.
- Возвращаемая строка должна быть краткой и информативной, в идеале не требующей пояснений.
- По крайней мере, поля, используемые для установления эквивалентности между двумя различными объектами, т. Е. Поля, используемые в реализации метода equals () , должны быть выделены методом toString ().
Предоставить методы доступа / получения для всех полей экземпляра, которые содержатся в возвращаемой строке. Например, в классе Coordinates,
public double getX() {
return x;
}
public double getY() {
return y;
}
Подробное описание метода toString () приведено в пункте 10 книги «Эффективное Java ™, второе издание» Джоша Блоха.