JavaRush /Java блог /Random UA /Як ефективно перевизначити метод ToString() засобами ToSt...
dio
16 рівень
Москва

Як ефективно перевизначити метод ToString() засобами ToStringBuilder.

Стаття з групи Random UA
ToStringBuilder це допоміжний клас, який надається бібліотекою apache commons lang . ToStringBuilder є службовим класом наданих Apache Commons Lang бібліотек. Він забезпечує повний і кращий контроль над тим, які дані об'єкта і в якій кількості повинні виводитися методом toString(), а також у якому форматі. ToStringBuilder допоможе уникнути написання великої кількості коду, позбавляючи необхідності перевизначати метод ToString() в дочірніх класах. ToStringBuilder може бути використаний для створення свого роду шаблону, щоб повною мірою використовувати можливості, що їм надаються. Щоб включити Commons-Lang до вашого проекту, додайте наступні залежності до конфігураційного файлу Maven. У цій статті я дам деякі приклади зразкового використання, які можна розглядати як найкращі практики для перевизначення методу ToString() у класах наступної програми. Щоб продемонструвати різні можливості використання ToStringBuilder для побудови методу toString() у різних сценаріях, я створюю три моделі: AbstractUser.java, WebUser.java and GuestUser.java. commons-lang commons-lang 2.5
AbstractUser.java
package com.howtodoinjava.model; import java.io.Serializable; import org.apache.commons.lang.builder.ToStringBuilder; import com.howtodoinjava.style.CustomToStringStyle; public abstract class AbstractUser implements Serializable { private static final long serialVersionUID = 1L; private int id; private String firstName; private String lastName; private String age; //Setterss and getters }
WebUser.java
public class WebUser extends AbstractUser { private static final long serialVersionUID = 1L; private Date lastLoggedIn; public Date getLastLoggedIn() { return lastLoggedIn; } public void setLastLoggedIn(Date lastLoggedIn) { this.lastLoggedIn = lastLoggedIn; } }
GuestUser.java
public class GuestUser extends WebUser { private static final long serialVersionUID = 1L; private String location; public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } }
Різні приклади використання
1) toString() метод у супер класі використовують усі дочірні класи.
Ви можете перевизначити метод toString() у класі об'єкта найвищого рівня, тобто. у нашому випадку AbstractUser.java. цей метод використовують усі дочірні класи, якщо вони не містять власну версію методу toString(). @Override public String toString() { return ToStringBuilder.reflectionToString(this); } Наведений вище метод ToString() здатний дати всю наявну інформацію про поточний клас, він також працюватиме і в підкласах, якщо тільки підклас не перевизначить метод ToString(). package com.howtodoinjava; import java.util.Date; import com.howtodoinjava.model.GuestUser; import com.howtodoinjava.model.WebUser; public class ToStringDemoUsage { public static void main(String[] args) { GuestUser guest = getGuestUser(); System.out.println(guest); } public static GuestUser getGuestUser() { GuestUser user = new GuestUser(); user.setId(100); user.setFirstName("Lokesh"); user.setLastName("Gupta"); user.setAge("30"); user.setLastLoggedIn(new Date()); user.setLocation("New Delhi"); return user; } } Output: com.howtodoinjava.model.GuestUser@d1f24bb[location=New Delhi,lastLoggedIn=Mon Jun 03 13:31:05 IST 2013,id=100,firstName=Lokesh,lastName=Gupta,age=30]
2) Користувальне форматування будь-якого типу, як у Data
Можна застосувати формат користувача для будь-якого поля в ToString методі. Приклад форматування користувача, показаний нижче: package com.howtodoinjava.style; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang.builder.ToStringStyle; public class CustomToStringStyle extends ToStringStyle { private static final long serialVersionUID = 1L; protected void appendDetail(StringBuffer buffer, String fieldName, Object value) { if (value instanceof Date) { value = new SimpleDateFormat("yyyy-MM-dd").format(value); } buffer.append(value); } } Для використання форматування, помістіть його в методі так: @Override public String toString() { return ToStringBuilder.reflectionToString(this, new CustomToStringStyle()); } Output: com.howtodoinjava.model.GuestUser@7910769b[location=New Delhi,lastLoggedIn=2013-06-03,id=100,firstName=Lokesh,lastName=Gupta,age=30]
3) Використовуйте інформацію із супер класу в підкласі з легким викликом методу
Якщо ви хочете перевизначити ToString () у дочірньому класі, для додавання чогось до інформації, отриманої від супер класу, зробіть це так: public class WebUser extends AbstractUser { //Other code @Override public String toString() { return new ToStringBuilder(this) .appendSuper(super.toString()) .append("lastLoggedIn", lastLoggedIn).toString(); } } Output: com.howtodoinjava.model.GuestUser@22aed3a5[location=New Delhi,lastLoggedIn=2013-06-03,id=100,firstName=Lokesh,lastName=Gupta,age=30,CustomMessage=I have been added additionally]
4) Використання інформації лише до певного рівня ієрархії наслідування
Припустимо, у якомусь дочірньому класі вам необхідно розкрити поля всіх супер класів, ви можете включити інформацію, до певного рівня ієрархії успадкування наступним шляхом: public class GuestUser extends WebUser { @Override public String toString() { return ToStringBuilder.reflectionToString(this,new CustomToStringStyle(),true,WebUser.class); } } Output: com.howtodoinjava.model.GuestUser@18dd7404[location=New Delhi,lastLoggedIn=2013-06-03]
5) Виводьте лише ту інформацію, яку хочете
Іноді ви не хочете включити всі поля класу метод ToString(). Тоді ви можете зробити це так: public abstract class AbstractUser implements Serializable { //Other code @Override public String toString() { return new ToStringBuilder(this) .append("firstName", firstName) .append("lastName", lastName) .append("age", age).toString(); } } public class GuestUser extends WebUser { //Other code @Override public String toString() { return new ToStringBuilder(this) .appendSuper(super.toString()) .append("location", location).toString(); } } Output: com.howtodoinjava.model.GuestUser@6483dae1[firstName=Lokesh,lastName=Gupta,age=30,location=New Delhi] Завантажити вихідний код наведених вище прикладів можна за цим посиланням. Download source Оригінальна стаття: How to override toString() effectively with ToStringBuilder Переклав
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ