10 подсказок по переопределению метода toString() в Java (часть 1)
10 подсказок по переопределению метода toString() в Java — ToStringBuilder Netbeans Eclipse
Java toString метод
toString
метод в Java используется для предоставления ясной и достаточной информации об объекте (Object
) в удобном для человека виде. Правильное переопределение метода toString
может помочь в ведении журнала работы и в отладке Java программы предоставляя ценную и важную информацию. Поскольку toString()
определен в java.lang.Object
класса и его реализация по умолчанию не предоставляет много информации, всегда лучшей практикой является переопределение данного метода в классе-потомке.
Фактически, если вы создаете важный или общий класс типа Order
, Trade
или Employee
, всегда переопределяйте equals, hashCode, compareTo и toString
методы в Java. По умолчанию реализация toString
создает вывод в виде package.class@hashCode
, к примеру для нашего примера toString()
,
метод класса Country
напечатает test.Country@18e2b22 где 18e2b22 это хэш-код объекта в шестнадцатеричном виде, если вы вызовете hashCode метод то он вернет 260943370, что является десятеричным эквивалентом 18e2b22. Эта информация не особо полезна во время поиска какой-либо проблемы. Давайте посмотрим на пример из реальной жизни где вам нужно найти проблему в соединении с сетью, в том случае если вы хотите знать с каким именно хостом и портом пытается соединиться ваша система и если Socket
или ServerSocket
печатает только информацию toString
по умолчанию, то будет невозможно представить реальную проблему, но с переопределенной реализацией toString
они могут предоставить полезную информацию, такую как имя хоста и номер порта. В этой Java-консультации мы дадим несколько подсказок по переопределению метода
с примерами кода.
Как переопределить метод toString в Java:
Печать форматированной даты(т.е. день/месяц/год) вместо «сырого» значения.
Это очень полезная подсказка при переопределении Java-метода toString
. Обычный toString()
класса java.util.Date
не выводит форматированную дату и включает много деталей, которые не всегда нужны. Если вы используете частичный DateFormat т.е. dd-MM-yy в вашем приложении, то вы определенно хотели бы видеть этот формат вместо данного по умолчанию. IDE обычно не генерирует форматированный вывод
и это то, что вам нужно сделать самому, но это того стоит. Прочитайте Как распечатать 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.Печатать вывод
toString
в несколько строк или в одну основываясь на его длине.Включать полные имена классов в представление
toString
, другими словамиpackage.class
что бы избежать любого непонимания.Вы можете пропускать значения null или показывать их, но лучше показывать. Иногда они полезны, поскольку показывают какое поле является
null
во время какого-то инциндента, к примеру NullPointerException.Используйте формат ключ-значение, к примеру
member.name=member.value
, большинство IDE поддерживают это.Включайте унаследованных членов, если вы считаете, что они должны предоставлять необходимую информацию в класс-наследник.
Иногда объект содержит много необязательных и обязательных параметров, как мы показали в нашем примере шаблона Builder, когда практически невозможно распечатать все поля, в этом случае можно выводить только обязательные поля, тем более, что у нас есть необязательные.
java — Метод toString() — Stack Overflow на русском
Вопрос задан
Изменён 3 года 1 месяц назад
Просмотрен 193 раза
У меня вопрос про использование метода toString(), его переопределение На сколько я знаю, он используется для удобного вывода данных об объекте (чтобы человеку было удобно эти данные прочесть).
У нас в университете в задании по java есть условие создать в классе метод, который бы выводил информацию об объекте.
Будет ли правильно переопределить данный метод и затем в классе Main.java вывести данные об объекте. Только мне нужна проверка в toString(): если переменная объекта не задана, то есть равна null, то мне нужно вывести «данные неизвестны». Можно ли в toString() делать такие проверки и вообще правильно ли использовать данный метод именно для такого вывода информации о классе. Просто где-то слышала, что метод toString() в каком-то случае использовать нельзя, это концептуально неправильно, но я послушала объяснение, а теперь вот сомневаюсь, не делаю ли я ошибку, используя его так.
P.S. я знаю, что правильнее всего было бы создать другой класс для вывода информации и в него передавать ссылку на объект, но в задании написано, что метод, печатающий информацию, должен быть именно в том же классе, в котором все его данные.
Заранее спасибо!
1
Да, переопределенный метод toString()
дает вам возможность представить в удобном виде состояние объекта. В методе toString()
как и в любом другом методе можно производить необходимые проверки, в том числе и на null
.
Есть случаи, когда метод toString()
использовать нежелательно, например, в перечислимых типах для получения имени enum-значения, т.к. enum-значения имеют метод
для этого, а метод toString()
может быть переопределен и его значение может не соответствовать ожидаемому.
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Документация JDK 20 — Главная
Обзор
- Прочтите меня
- Примечания к выпуску
- Что нового
- Руководство по миграции
- Загрузить JDK
- Руководство по установке
- Формат строки версии
Инструменты
- Технические характеристики инструментов JDK
- Руководство пользователя JShell
- Руководство по JavaDoc
- Руководство пользователя средства упаковки
Язык и библиотеки
- Обновления языка
- Основные библиотеки
- HTTP-клиент JDK
- Учебники по Java
- Модульный JDK
- Руководство программиста API бортового регистратора
- Руководство по интернационализации
Технические характеристики
- Документация API
- Язык и ВМ
- Имена стандартных алгоритмов безопасности Java
- банок
- Собственный интерфейс Java (JNI)
- Инструментальный интерфейс JVM (JVM TI)
- Сериализация
- Проводной протокол отладки Java (JDWP)
- Спецификация комментариев к документации для стандартного доклета
- Прочие характеристики
Безопасность
- Руководство по безопасному кодированию
- Руководство по безопасности
Виртуальная машина HotSpot
- Руководство по виртуальной машине Java
- Настройка сборки мусора
Управление и устранение неполадок
- Руководство по устранению неполадок
- Руководство по мониторингу и управлению
- Руководство по JMX
Client Technologies
- Руководство по специальным возможностям Java
Никогда не используйте toString() для поведения
Java
Каждый объект в Java имеет метод toString()
, который можно вызвать для получения строкового представления любого объекта. Если его не переопределить, он выдает только описание своего класса и хеш-кода, что не очень полезно для многих целей.
2 min read
·
By Rune Flobakk
·
4 декабря 2019
У вас, вероятно, есть много классов, представляющих что-то, что нужно кодировать как строку, скажем, для сохранения, для запросов API, передачи состояния в другие несвязанные классы или еще. Примерами, которые приходят на ум, являются национальные идентификационные номера, номера телефонов, страны, города, что угодно. Может возникнуть соблазн переопределить метод toString() вашего класса Country, чтобы просто получить название страны. Похоже, что метод уже существует только для такого использования. Это удобно позволяет экземплярам Country предоставлять значимую информацию при объединении строк журнала, а для любых частей нашего приложения, требующих названия страны в виде простой строки, мы можем просто вызвать toString().
Использование вывода toString() для всего, что связано с поведением, сопряжено с риском скрытого нарушения поведения, поскольку все объекты в Java имеют этот метод. Если вы вызываете toString() в любом месте, чтобы получить название страны, в системе типов нет ничего, что указывало бы на то, что это действительно страна, название которой вы получаете.
Одним из наиболее очевидных виновников является изменение сигнатуры метода, ранее установленного для возврата Country
, вместо возврата Optional
, а затем измените любой код, который теперь не компилируется, чтобы он правильно обрабатывал возвращаемый экземпляр как необязательный. Но код, который преобразует Country в String, все равно будет работать. Если вы использовали возвращенную страну для создания запроса API, включая название страны, теперь это будет создавать странные страны с именем «Необязательный [«Норвегия»]» или даже «Необязательный.пусто», и компилятор с радостью примет это. Что должно было быть использовано, так это метод с соответствующим названием, специфичный для типа страны, например.