User Ku6ep
Ku6ep
35 уровень

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

Статья из группы Архив info.javarush.ru
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, когда практически невозможно распечатать все поля, в этом случае можно выводить только обязательные поля, тем более, что у нас есть необязательные.

Оригинал статьи тут: https://javarevisited.blogspot.com/2012/09/override-tostring-method-java-tips-example-code.html
Комментарии (9)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
HF Уровень 41, Харьков, Украина
16 марта 2021
Статья сложно написана для начинающих.
Anonymous #2352740 Уровень 10, Казань, Россия
11 января 2021
Нечитабельно
20 августа 2020
Народ, подскажите как должен работать toString ? У меня красным подчёркивает и говорить доопределить этот метод в классе т.е. по default его нет. Что делать?
Андрей Уровень 12, Москва, Россия
24 мая 2020
https://www.youtube.com/watch?v=KEQ043yT3F4 короче тут попроще для понимания (для меня) было
Alukard Уровень 36, London Expert
24 апреля 2020
Попал сюда на седьмом уровне, до этого немного разобрался как переопределить метод @Override. С этой же статьей пока немного сложновато, но в любом случае со временем понимание ко мне надеюсь придёт)
Аманбек Уровень 1
17 февраля 2019
Плиз пишите кратко и ясно с примерами кода
Владислав Уровень 10, Москва
3 декабря 2018
Мало что понял сразу, но видно, что важная штука) добавил в закладки, прочитаю после апгрейда