Урок 20. Метод toString() Java


На этом уроке из учебника Java я объясню метод toString(). Я также кратко коснусь getClass(), поскольку он имеет отношение к методу toString() по умолчанию.

Метод toString() возвращает строку, представляющую объект, который может быть выведен на консоль или в пользовательском интерфейсе. Давайте посмотрим на стандартный метод toString() объекта класса.

public String toString() {
     return getClass().getName() + ‘@’ + Integer.toHexString(hashCode());
}
Код выше показывает, как метод toString() объединяет метод getClass().getName (), символ ‘@’ и шестнадцатеричное значение хэш-кода объекта для создания строки, представляющей объект. Метод getClass() возвращает класс среды выполнения класса, к которому принадлежит объект. Затем метод getName() возвращает полное имя класса. Например, если у вас есть класс “BMW” в пакете “com.java8course” и вы создаете экземпляр объекта BMW, вызов getClass().getName() вернет “com.java8course.BMW”. Метод Integer.toHexString(hashCode()) создает шестнадцатеричное представление хэш-кода объекта. Вот краткий пример метода, который будет использовать вызов toString():

@Test
public void shouldConvertBMWToString() {
      BMW bmw = new BMW(new Name("Marcus", "Biel"), new Color("silver"));
      System.out.println(bmw.toString());
      System.out.println(bmw);
}
Обе строки System.out.println() в коде выше вызывают объект toString(). Это происходит потому, что метод println() перегружен, а это означает, что он существует в нескольких различных вариациях, которые ожидают разных аргументов. Первый вариант предполагает вывод строки. Тем временем второй вызов ожидает объект, который затем переходит к вызову метода String.valueOf (), который затем вызовет метод toString(). Обратите внимание, что в продакшн, вообще говоря, вы должны использовать logging вместо System.out.println().

Хотя System.out.println() хорошо работает для отладки или диагностики информации в консоли, ему не хватает гибкости ведения журнала с точки зрения вывода. Регистратор также обычно дает лучшую производительность. Возвращаясь к описанному выше методу, любой вызов System.out.println() вернет BMW@e2144e4. Эта строка не очень полезна для нас, особенно если мы отлаживаем код и пытаемся понять текущее состояние объекта. Предположительно, если мы вызываем объект BMW toString (), мы знаем, что это объект BMW. По этой причине вы должны переопределить метод toString() для большинства классов сущностей.

Переопределение метода ToString()

public class BMW implements Car, Cloneable {

       private Name ownersName;
       private Color color;

       public BMW(Name ownersName, Color color) {
             this.ownersName = ownersName;
             this.color = color;
       }
}
Здесь вы можете увидеть класс BMW, на который я ссылался в своем предыдущем примере. Как вы видели в предыдущем разделе, когда мы вызываем println(bmw.toString()), мы получаем что-то вроде BMW@e2144e4. Это происходит потому, что мы еще не переопределили метод toString. Прежде чем переопределить метод, мы должны определить, что мы хотим, чтобы он возвращал. В случае этого класса он имеет два атрибута: имя владельца (ownersName) и цвет (color). Мы также можем захотеть вернуть тип класса объекта, и мы можем легко сделать это, вызвав метод getClass(), который я выделил ранее.

@Override
public String toString() {
      return getClass().getName() + " [" + ownersName + ", " + color + "]";
}
Выше я переопределил метод toString() для класса BMW. Я использовал @override как инструмент, который я могу использовать, даже если это не обязательно для запуска кода. Это заставляет мой компилятор убедиться, что я действительно переопределяю метод (а не просто пишу новый метод), и позволяет кому-то, читающему мой код, понять, что я переопределяю метод. Еще один момент, который я хотел бы подчеркнуть, заключается в том, что я не пишу цвет.toString(). В этом нет необходимости, поскольку знак “+” между строками позволяет компилятору понять, что я объединяю строки, и автоматически вызывает метод toString() для этих объектов.

@Test
public void shouldConvertBMWToString() {
      BMW bmw = new BMW(new Name("M", "B"), new Color("silver"));
      System.out.println(bmw.toString());
}
Если я снова запущу этот метод, предполагая, что мы создали методы Name toString() и Color toString(), то теперь наш вывод будет “BMW [M B, silver]". Теперь, когда мы вызываем метод toString ), у нас есть нечто более значимое, чем хэш-код, который мы можем распечатать в консоли, журнале или распечатать в пользовательском интерфейсе, который позволит пользователю увидеть содержимое объекта.

StringBuilder: альтернатива конкатенации строк

Последнее, что я хотел бы выделить в этой статье, - это класс StringBuilder. Конкатенация строк с “+” может стоить небольшого количества производительности за вызов, и если у вас есть цикл, объединяющий миллионы строк, эта небольшая разница может стать актуальной. Однако, поскольку компилятор заменит конкатенацию строк и в большинстве случаев будет использовать StringBuilder, вы должны сначала выбрать наиболее читаемый код. Дальнейшая оптимизация производительности возможна только при необходимости, охватываемой тестами. Ниже приведен альтернативный метод toString(), который использует StringBuilder, а не конкатенацию строки. Он создаст строку динамически, без плюсов.

@Override
public String toString() {
      return new StringBuilder (“BMW [“).append(ownersName).append(“,“)
           .append(color).append(“]”).toString();
}
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, уроки по java, java, методы, строки




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Что такое Java или особенности языка
Математическая функция
Конвейеризация и постоянные соединения