Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ทำไมต้อง Override toString() ใน Java: ทำให้ Object อ่านง่าย Debug เร็วขึ้น

เมธอด 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+) หรือ @Data Lombok เพื่อลด 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
        '}';
}

บทความเกี่ยวข้อง