JavaRush /จาวาบล็อก /Random-TH /วิธีแทนที่วิธี ToString() อย่างมีประสิทธิภาพโดยใช้ ToStri...
dio
ระดับ
Москва

วิธีแทนที่วิธี ToString() อย่างมีประสิทธิภาพโดยใช้ ToStringBuilder

เผยแพร่ในกลุ่ม
ToStringBuilderเป็นคลาสตัวช่วยที่จัดทำโดย ไลบรารี apache commons lang ToStringBuilder เป็นคลาสยูทิลิตี้ที่จัดทำโดยไลบรารี Apache Commons Lang โดยให้การควบคุมที่สมบูรณ์และดีขึ้นเกี่ยวกับข้อมูลอ็อบเจ็กต์ใด และจำนวนที่ควรส่งออกโดยเมธอด toString() รวมถึงในรูปแบบใด ToStringBuilder ช่วยให้คุณหลีกเลี่ยงการเขียนโค้ดจำนวนมากโดยไม่จำเป็นต้องแทนที่เมธอด ToString() ในคลาสย่อย ToStringBuilder สามารถใช้เพื่อสร้างเทมเพลตประเภทต่างๆ เพื่อใช้ประโยชน์จากความสามารถที่มีให้อย่างเต็มที่ หากต้องการรวม Commons-Lang ในโปรเจ็กต์ของคุณ ให้เพิ่มการขึ้นต่อกันต่อไปนี้ในไฟล์การกำหนดค่า Maven ของคุณ ในบทความนี้ ฉันจะยกตัวอย่างการใช้งานที่ถือได้ว่าเป็น แนวทางปฏิบัติที่ดีที่สุดในการแทนที่เมธอด ToString() ในคลาสของแอปพลิเคชันถัดไปของคุณ เพื่อสาธิตความเป็นไปได้ที่แตกต่างกันของการใช้ ToStringBuilder เพื่อสร้างเมธอด toString() ในสถานการณ์ที่แตกต่างกัน ฉันจะสร้างโมเดลสามแบบ: AbstractUser.java, WebUser.java และ 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 }
ผู้ใช้เว็บ.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) การจัดรูปแบบที่กำหนดเองทุกประเภท เช่น ข้อมูล
คุณสามารถใช้รูปแบบที่กำหนดเองกับฟิลด์ใดก็ได้ในเมธอด 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] คุณสามารถดาวน์โหลดซอร์สโค้ดของตัวอย่างข้างต้นได้จากลิงค์นี้ ดาวน์โหลดต้นฉบับ บทความต้นฉบับ: วิธีแทนที่ toString() อย่างมีประสิทธิภาพด้วย ToStringBuilder Translated
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION