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 Перевел