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(), оскільки перегрузка замість перевизначення може створити більш тонкі, складно виявлені помилки. Усе одно краще використовувати анотацію @Override.

Друк вмісту масиву, замість виводу об'єкта масиву

Масив це об'єкт у 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, коли практично неможливо вивести всі поля, у цьому випадку можна відображати тільки обов'язкові поля, тим більше, що у нас є необов'язкові.