พื้นหลัง
วัตถุ 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
- ชื่อของชั้นคือระดับคือในแพคเกจMyType
com.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;
}
}
ตอนนี้ถ้าเราพิมพ์เราจะเห็นชื่อของพวกเขามากกว่าPerson
com.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()
ตามที่กล่าวไว้ข้างต้น