Java Переопределение toString() с помощью ToStringBuilder

ToStringBuilder — это служебный класс, предоставляемый библиотекой Apache Commons Lang. ToStringBuilder — это служебный класс, предоставляемый библиотекой Apache Commons Lang. Он обеспечивает последовательный и лучший контроль над тем, какие и сколько данных объект должен предоставлять с помощью метода toString() и в каком формате. Он также может помочь в уменьшении размера кода, устраняя необходимость переопределения метода toString() в дочерних подклассах. Его можно использовать для построения некоторого шаблона проектирования, чтобы в полной мере использовать предоставляемые им возможности.

Чтобы включить commons-lang в свой проект, добавьте следующую зависимость в файл конфигурации maven.

<dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.5</version></dependency>

В этой статье я приведу несколько примеров использования, которые можно считать лучшими практиками переопределения метода toString() в классах вашего следующего приложения.

Чтобы продемонстрировать различные возможные варианты использования ToStringBuilder для построения метода toString() в различных сценариях, я воспользуюсь тремя классами моделей, а именно AbstractUser.java, WebUser.java и 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() из класса Object один раз в самом верхнем суперклассе, т.е. в нашем случае AbstractUser.java. Этот метод будет доступен для использования всеми дочерними классами, если они не предоставили свою собственную версию метода toString().

@Overridepublic String toString(){return ToStringBuilder.reflectionToString(this);}

Вышеуказанный метод способен предоставить всю доступную информацию для класса и его подклассов, если 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) Пользовательское форматирование любого типа поля, например, «Дата»

Вы можете принудительно применить пользовательское форматирование для любого типа поля в методе toString, и это также не тесно связано с реализацией 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);}}

Чтобы использовать этот форматировщик, передайте его методу следующим образом.

@Overridepublic 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@Overridepublic 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{@Overridepublic 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@Overridepublic String toString() {return new ToStringBuilder(this).append("firstName", firstName).append("lastName", lastName).append("age", age).toString();}}public class GuestUser extends WebUser{//Other code@Overridepublic 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]

Загрузите исходный код приведенных выше примеров по ссылке ниже.

Исходный код Скачать
Прокрутить вверх