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
Перевел
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ