เมธอด toString() ใน Java ใช้สำหรับแปลง Object ให้เป็น String representation ที่อ่านเข้าใจง่าย หากไม่ Override จะได้ค่า default ที่ไม่อ่านออก (classname@hashcode)
ปัญหา toString() ค่า Default
public class User {
private String name;
private String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
// ไม่มี toString()
}
User user = new User("John", "john@example.com");
System.out.println(user);
// Output: User@15db9742 ❌ ไม่อ่านออกว่าเป็นใคร
แก้ไขด้วย Override toString()
public class User {
private String name;
private String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
@Override
public String toString() {
return "User{name='" + name + "', email='" + email + "'}";
}
}
User user = new User("John", "john@example.com");
System.out.println(user);
// Output: User{name='John', email='john@example.com'} ✅ อ่านง่าย
เทคนิคเขียน toString() ที่ดี
1. ใช้ StringBuilder (ประสิทธิภาพดี)
@Override
public String toString() {
return new StringBuilder()
.append("User{")
.append("name='").append(name).append('\'')
.append(", email='").append(email).append('\'')
.append('}')
.toString();
}
2. ใช้ String.format() (อ่านง่าย)
@Override
public String toString() {
return String.format("User{name='%s', email='%s'}", name, email);
}
3. Java 17+ Record - สร้าง toString() ให้อัตโนมัติ! ✅
// Java 17+ Record
public record User(String name, String email) {}
// การใช้งาน
User user = new User("John", "john@example.com");
System.out.println(user);
// Output: User[name=John, email=john@example.com]
💡 เคล็ดลับ: ใช้
record(Java 17+) หรือ@DataLombok เพื่อลด Boilerplate code
4. Lombok @Data (ยอดนิยมใน Enterprise)
import lombok.Data;
@Data // สร้าง getter, setter, toString, equals, hashCode ให้อัตโนมัติ
public class User {
private String name;
private String email;
}
Best Practices สำหรับ toString()
- ✅ รวม field สำคัญทั้งหมดที่ช่วย identify object
- ✅ ใช้รูปแบบที่สอดคล้องกันทั่วโปรเจกต์ (เช่น ClassName{field=value, ...})
- ✅ หลีกเลี่ยง field ที่เป็น sensitive (password, token, credit card)
- ✅ หลีกเลี่ยง circular reference (A มี B, B มี A → StackOverflowError)
- ✅ ใช้
Objects.toString()สำหรับ null-safe field
ตัวอย่าง Null-Safe toString()
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
", address=" + Objects.toString(address, "N/A") + // null-safe
'}';
}