JavaRush /Java блог /Архив info.javarush /10 подсказок по переопределению метода toString() в Java ...
Ku6ep
35 уровень

10 подсказок по переопределению метода toString() в Java (часть 1)

Статья из группы Архив info.javarush
10 подсказок по переопределению метода toString() в Java - ToStringBuilder Netbeans Eclipse 10 подсказок по переопределению метода toString() в Java (часть 1) - 1

Java toString метод

toString метод в Java используется для предоставления ясной и достаточной информации об объекте (Object) в удобном для человека виде. Правильное переопределение метода toString может помочь в ведении журнала работы и в отладке Java программы предоставляя ценную и важную информацию. Поскольку toString() определен в java.lang.Object класса и его реализация по умолчанию не предоставляет много информации, всегда лучшей практикой является переопределение данного метода в классе-потомке. Фактически, если вы создаете важный или общий класс типа Order, Trade или Employee, всегда переопределяйте equals, hashCode, compareTo и toString методы в Java. По умолчанию реализация toString создает вывод в виде package.class@hashCode, к примеру для нашего примера toString(), toString() метод класса Country напечатает test.Country@18e2b22 где 18e2b22 это хэш-код объекта в шестнадцатеричном виде, если вы вызовете hashCode метод то он вернет 260943370, что является десятеричным эквивалентом 18e2b22. Эта информация не особо полезна во время поиска какой-либо проблемы. Давайте посмотрим на пример из реальной жизни где вам нужно найти проблему в соединении с сетью, в том случае если вы хотите знать с каким именно хостом и портом пытается соединиться ваша система и если Socket или ServerSocket печатает только информацию toString по умолчанию, то будет невозможно представить реальную проблему, но с переопределенной реализацией toString они могут предоставить полезную информацию, такую как имя хоста и номер порта. В этой Java-консультации мы дадим несколько подсказок по переопределению метода toString с примерами кода.

Как переопределить метод toString в Java:

Печать форматированной даты(т.е. день/месяц/год) вместо "сырого" значения. Это очень полезная подсказка при переопределении Java-метода toString. Обычный toString() класса java.util.Date не выводит форматированную дату и включает много деталей, которые не всегда нужны. Если вы используете частичный DateFormat т.е. dd-MM-yy в вашем приложении, то вы определенно хотели бы видеть этот формат вместо данного по умолчанию. IDE обычно не генерирует форматированный вывод Date и это то, что вам нужно сделать самому, но это того стоит. Прочитайте Как распечатать Date в формате ddMMyy в Java где детально описано форматирование Date в Java. Вы так же можете использовать SimpleDataFormat класс или библиотеку Joda Date time для этого.

Документирование формата toString

Если ваш метод toString() не выводит данные в виде поле=значение, то хорошей идеей будет документирование формата вывода toString, особенно для важных объектов типа Работник или Студент. К примеру если метод toString() класса Работник(Employee) печатает "John-101-Sales-9846387321" то хорошей практикой будет указать формат как "имя-ID-отдел-контакт", но в то же время не давайте клиенту возможность получать информацию из метода toString(), вы должны всегда предоставлять соответствующие методы для получения данных, такие как getName(), getId(), getContact() и так далее, поскольку информация полученная из toString() представления объекта является хрупкой и подвержена ошибкам, так что клиент всегда должен иметь чистый путь получения информации.

Используйте StringBuilder для составления вывода toString()

Если вы пишете код для метода toString() в Java, тогда используйте StringBuilder что бы добавить отдельные атрибуты. Если вы используете IDE вроде Eclipse, Netbeans или IntelliJ тогда использование StringBuilder и метода append() вместо оператора + для составления toString, так же является верным путем. По умолчанию и Eclipse и Netbeans генерируют toString с оператором конкатенации.

Использование аннотации @Override

Использование @Override при переопределении метода в Java это одна из лучших практик в языке. Но эта подсказка не так важна, как это было бы в случае с переопределением методов equals() и compareTo(), поскольку перегрузка вместо переопределения может создать более тонкие, сложно вычисляемые, ошибки. В любом случае лучше использовать аннотацию @Overrride.

Печать содержимого массива, вместо вывода объекта массива

Массив это объект в Java но он не переопределяет метод toString и когда вы печатаете массив, то по умолчанию формат вывода не особо полезен, поскольку мы хотели бы видеть содержимое массива. К слову это еще одна причина почему char[] array предпочтительнее String для хранения чувствительных данных, таких как пароль. Найдите время взглянуть помогает ли печать содержимого массива вашим клиентам или нет и если это имеет смысл, то печатайте содержимое массива вместо самого объекта. Из соображений производительности предпочтительнее использовать Collection такие как ArrayList или HashSet вместо Array для хранения других объектов.

Бонусные подсказки

Еще несколько бонусных подсказок по переопределению метода toString в Java.
  1. Печатать вывод toString в несколько строк или в одну основываясь на его длине.

  2. Включать полные имена классов в представление toString, другими словами package.class что бы избежать любого непонимания.

  3. Вы можете пропускать значения null или показывать их, но лучше показывать. Иногда они полезны, поскольку показывают какое поле является null во время какого-то инциндента, к примеру NullPointerException.

  4. Используйте формат ключ-значение, к примеру member.name=member.value, большинство IDE поддерживают это.

  5. Включайте унаследованных членов, если вы считаете, что они должны предоставлять необходимую информацию в класс-наследник.

  6. Иногда объект содержит много необязательных и обязательных параметров, как мы показали в нашем примере шаблона Builder, когда практически невозможно распечатать все поля, в этом случае можно выводить только обязательные поля, тем более, что у нас есть необязательные.

Комментарии (15)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Олег Уровень 78 Expert
26 мая 2023
мутная тема....
Victor Уровень 7
16 декабря 2022
https://www.youtube.com/watch?v=KEQ043yT3F4
AbubakirovRA Уровень 2
3 августа 2022
Текст переведен нечитабельно, ощущение, что не человек переводил, а онлайн-переводчик. Статья не имеет практической ценности для обучающихся. Времени и так не хватает, потратил его зря на прочтение с нулевым результатом.
Марат Гарипов Уровень 108 Expert
14 июня 2022
Соглашусь, что подача суховата, Но человек лишь перевел статью, за что нужно быть благодарным, и накидал ссылок на чтиво, с которым придется иметь дело в реальной жизни. Ведь, когда, да смилостивится Бог кода, мы отправимся в самостоятельное плавание, в случае вопросов, ответы придется искать в подобных статьях, а отнюдь не в игровом формате юзер-френдли комиксов джавараша) Всем удачи и да пребудет с нами сила!
eldar516 Уровень 100
27 февраля 2022
статью было очень трудно прочитать из-за манеры изложения текста...
Aleksei Reinsalu Уровень 19
12 ноября 2021
На всякий случай сохранил, мало ли какие задачи пойдут. 13 уровень Syntax и больше ничего - мой уровень на сей момент.
HF Уровень 41
16 марта 2021
Статья сложно написана для начинающих.
Anonymous #2352740 Уровень 10
11 января 2021
Нечитабельно
20 августа 2020
Народ, подскажите как должен работать toString ? У меня красным подчёркивает и говорить доопределить этот метод в классе т.е. по default его нет. Что делать?
Андрей Уровень 12
24 мая 2020
https://www.youtube.com/watch?v=KEQ043yT3F4 короче тут попроще для понимания (для меня) было