
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()
, оскільки перегрузка замість перевизначення може створити більш тонкі, складно виявлені помилки. Усе одно краще використовувати анотацію @Override
.
Друк вмісту масиву, замість виводу об'єкта масиву
Масив це об'єкт у Java, але він не перевизначає методtoString
, і коли ви друкуєте масив, то за замовчуванням формат виводу не дуже корисний, оскільки ми хотіли б бачити вміст масиву. До речі, це ще одна причина чому char[] array кращий за String для зберігання чутливих даних, таких як пароль. Знайдіть час перевірити, чи допомагає друк вмісту масиву вашим клієнтам чи ні, і якщо це має сенс, то друкуйте вміст масиву замість самого об'єкта. З міркувань продуктивності кращим є використання Collection
таких як ArrayList
або HashSet замість Array
для зберігання інших об'єктів.
Бонусні підказки
Ще кілька бонусних підказок щодо перевизначення методуtoString
у Java.
Виводити результат
toString
у кілька рядків чи в один, виходячи з його довжини.Включати повні імена класів у представлення
toString
, іншими словамиpackage.class
, щоб уникнути будь-якого непорозуміння.Ви можете пропускати значення null чи показувати їх, але краще показувати. Іноді вони корисні, оскільки вказують, яке поле є
null
під час якогось інциденту, наприклад NullPointerException.Використовуйте формат ключ-значення, наприклад
member.name=member.value
, більшість IDE підтримують це.Включайте успадковані елементи, якщо вважаєте, що вони повинні надавати необхідну інформацію в класі-нащадку.
Іноді об'єкт містить багато необов'язкових та обов'язкових параметрів, як ми показали у нашому прикладі шаблону Builder, коли практично неможливо вивести всі поля, у цьому випадку можна відображати тільки обов'язкові поля, тим більше, що у нас є необов'язкові.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ