JavaRush /Java блог /Архив info.javarush /Как эффективно переопределить метод ToString () средствам...
dio
16 уровень
Москва

Как эффективно переопределить метод ToString () средствами ToStringBuilder.

Статья из группы Архив info.javarush
ToStringBuilder это вспомогательный класс, предоставляемый библиотекой apache commons lang. ToStringBuilder является служебным классом предоставляемых Apache Commons Lang библиотек. Он обеспечивает полный и лучший контроль над тем, какие данные объекта и в каком количестве должны выводится методом toString(),а так же в каком формате. ToStringBuilder поможет избежать написания большого количества кода, избавляя от необходимости переопределять метод ToString() в дочерних классах. ToStringBuilder может быть использован для создания своего рода шаблона, чтобы в полной мере использовать предоставляемые им возможности. Чтобы включить Commons-Lang в ваш проект, добавьте следующие зависимости в конфигурационный файл Maven. commons-lang commons-lang 2.5 В этой статье я дам некоторые примеры образцового использования, которые можно рассматривать как лучшие практики для переопределения метода ToString() в классах вашего следующего приложения. Что бы продемонстрировать различные возможности использования ToStringBuilder для построения метода toString() в различных сценариях, я создам три модели : AbstractUser.java, WebUser.java and GuestUser.java.
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 Перевел
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ