พื้นหลัง
วัตถุ Java ทั้งหมดมีtoString()วิธีการซึ่งถูกเรียกเมื่อคุณลองและพิมพ์วัตถุ
System.out.println(myObject); // invokes myObject.toString()
วิธีนี้ถูกกำหนดไว้ในObjectคลาส (superclass ของวัตถุ Java ทั้งหมด) Object.toString()วิธีการส่งกลับสตริงมองน่าเกลียดอย่างเป็นธรรมประกอบด้วยชื่อของชั้นเรียนนั้น@สัญลักษณ์และแฮชโค้ดของวัตถุในฐานสิบหก รหัสสำหรับสิ่งนี้ดูเหมือนว่า:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
ผลลัพธ์เช่นcom.foo.MyType@2f92e0f4สามารถอธิบายได้ดังนี้:
com.foo.MyType - ชื่อของชั้นคือระดับคือในแพคเกจMyTypecom.foo
@ - รวมสตริงเข้าด้วยกัน
2f92e0f4 hashcode ของวัตถุ
ชื่อของชั้นเรียนอาร์เรย์มีลักษณะที่แตกต่างกันเล็ก ๆ น้อย ๆ ซึ่งจะมีการอธิบายได้ดีใน Javadocs Class.getName()สำหรับ ตัวอย่างเช่น[Ljava.lang.Stringหมายถึง:
[- อาร์เรย์แบบมิติเดียว (ตรงข้ามกับ[[หรือ[[[เป็นต้น)
L - อาร์เรย์มีคลาสหรือส่วนต่อประสาน
java.lang.String - ประเภทของวัตถุในอาร์เรย์
การปรับแต่งเอาต์พุต
หากต้องการพิมพ์สิ่งที่แตกต่างเมื่อคุณเรียกSystem.out.println(myObject)คุณต้องแทนที่toString()วิธีการในชั้นเรียนของคุณเอง นี่คือตัวอย่างง่ายๆ:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
ตอนนี้ถ้าเราพิมพ์เราจะเห็นชื่อของพวกเขามากกว่าPersoncom.foo.Person@12345678
จำไว้ว่าtoString()เป็นเพียงหนึ่งในวิธีการที่วัตถุจะถูกแปลงเป็นสตริง โดยทั่วไปผลลัพธ์นี้ควรอธิบายวัตถุของคุณอย่างชัดเจนและรัดกุม อาจดีกว่าtoString()สำหรับPersonชั้นเรียนของเรา:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
Person[name=Henry]ซึ่งจะพิมพ์เช่น นั่นเป็นข้อมูลที่มีประโยชน์จริงๆสำหรับการดีบัก / ทดสอบ
String toElegantReport() {...}หากคุณต้องการที่จะมุ่งเน้นเพียงแง่มุมหนึ่งของวัตถุของคุณหรือรวมจำนวนมากของการจัดรูปแบบทันสมัยที่คุณอาจจะดีกว่าที่จะกำหนดวิธีการแยกจากกันแทนเช่น
สร้างเอาต์พุตโดยอัตโนมัติ
IDEsจำนวนมากให้การสนับสนุนtoString()วิธีการสร้างอัตโนมัติตามฟิลด์ในชั้นเรียน ดูเอกสารสำหรับEclipseและIntelliJยกตัวอย่างเช่น
ห้องสมุด Java ยอดนิยมหลายแห่งเสนอคุณสมบัตินี้เช่นกัน ตัวอย่างบางส่วน ได้แก่ :
การพิมพ์กลุ่มของวัตถุ
ดังนั้นคุณได้สร้างสิ่งที่ดีtoString()สำหรับชั้นเรียนของคุณ จะเกิดอะไรขึ้นถ้าคลาสนั้นถูกวางในอาร์เรย์หรือคอลเล็กชัน
อาร์เรย์
หากคุณมีอาเรย์ของวัตถุคุณสามารถโทรArrays.toString()เพื่อสร้างการแสดงเนื้อหาของอาเรย์อย่างง่าย ตัวอย่างเช่นพิจารณาอาร์เรย์ของPersonวัตถุนี้:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
หมายเหตุ: นี่เป็นการเรียกใช้เมธอดสแตติกที่เรียกว่าtoString()ในคลาส Arrays ซึ่งแตกต่างจากสิ่งที่เราได้พูดถึงข้างต้น
หากคุณมีอาเรย์หลายมิติคุณสามารถใช้Arrays.deepToString()เพื่อให้ได้ผลลัพธ์ในประเภทเดียวกัน
คอลเลกชัน
คอลเลกชันส่วนใหญ่จะให้ผลลัพธ์ที่ดีโดยอิงจากการเรียก.toString()ใช้ทุกองค์ประกอบ
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
ดังนั้นคุณเพียงแค่ต้องให้แน่ใจว่าองค์ประกอบรายการของคุณกำหนดสิ่งที่ดีtoString()ตามที่กล่าวไว้ข้างต้น