
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.
Печатать вывод
toString
в несколько строк или в одну основываясь на его длине.Включать полные имена классов в представление
toString
, другими словамиpackage.class
что бы избежать любого непонимания.Вы можете пропускать значения null или показывать их, но лучше показывать. Иногда они полезны, поскольку показывают какое поле является
null
во время какого-то инциндента, к примеру NullPointerException.Используйте формат ключ-значение, к примеру
member.name=member.value
, большинство IDE поддерживают это.Включайте унаследованных членов, если вы считаете, что они должны предоставлять необходимую информацию в класс-наследник.
Иногда объект содержит много необязательных и обязательных параметров, как мы показали в нашем примере шаблона Builder, когда практически невозможно распечатать все поля, в этом случае можно выводить только обязательные поля, тем более, что у нас есть необязательные.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ