ถาม หนูไม่เข้าใจ Method toString() กับ Method valueOf() ว่ามันแตกต่างกันอย่างไรคะ
valueOf() เป็นเมธอดที่ใช้เปลี่ยนตัวแปรที่มี Type ต่างๆ ให้เป็น String เช่นในคำสั่ง
print หรือเปล่าคะ ส่วน toString() เป็นเมธอดที่ใช้เปลี่ยนข้อมูลที่อยู่ใน Object
ให้เป็น String หรือเปล่าค่ะ เมธอดนี้สามารถถูก Override ได้ในทุก Class เลยหรือคะ
ตอบ เมธอด toString()
ใช้สำหรับแปลงหรือแทนข้อมูลใน object
ให้อยู่ในรูปของ String
เพื่อความสะดวกในการ debug หรือนำข้อมูลใน
object ไปแสดงผล
เมธอด toString กำหนดไว้ในคลาส Object ซึ่งเป็นคลาสบนสุด เพื่อให้คลาสต่างๆ รับทอดไปใช้
เมธอด toString() ในคลาส Object จะแสดงชื่อคลาสและที่อยู่ของอ๊อบเจ็กท์ เราอาจ
override เมธอดนี้โดยเขียนเมธอดนี้ขึ้นมาเองในคลาสของเราเพื่อใช้แปลงหรือแทนข้อมูลต่างๆ
ให้อยู่ในรูปของ String ที่มีความหมายเหมาะกับแต่ละคลาสเพื่อความสะดวกในการนำไปใช้งาน
จะเอาข้อมูลอะไรในอ๊อบเจ็กท์มาแปลงให้เป็น String บ้างก็เป็นเรื่องของผู้เขียนคลาสนั้นๆ
(ดูตัวอย่างได้จากตัวอย่างโปรแกรมที่เคยเขียนให้ดู)
ส่วนเมธอด valueOf(...) เป็น เมธอดของคลาส (static method) ซึ่งกำหนดไว้ในคลาส
String ใช้สำหรับแปลงข้อมูลพื้นฐานชนิดต่างๆ ให้เป็น String เมธอดนี้ถูก overload
ให้รับพารามิเตอร์ได้หลายประเภท ซึ่งจะมีประโยชน์ในการแปลงข้อมูลพื้นฐานประเภทต่างๆ
ให้เป็น String โดยสะดวกนั่นเอง
ข้อแตกต่าง
เมธอด toString สามารถใช้ได้ในทุกคลาส เนื่องจากรับทอดมาจากคลาสบนสุดคือ Object
เมธอดนี้อาจถูก override เพื่อให้แปลงข้อมูลที่จำเพาะเจาะจงสำหรับแต่ละคลาสได้
คลาสที่ override เมธอดนี้มักจะให้ข้อมูลที่ชัดเจนเป็นประโยชน์ String ที่ได้อาจเป็นผลมาจากข้อมูลหลายตัวใน
object ของคลาสนั้นๆ ในการพิมพ์ด้วยเมธอด print() หรือ println() ถ้าส่ง อ๊อบเจ็กท์เข้าไปเป็นพามิเตอร์
คอมไพเลอร์จะเรียกเมธอด toString() เพื่อแปลงข้อมูลของอ๊อบเจ็กท์นั้นให้อยู่ในรูปของ
String เสียก่อนแล้วจึงนำไปแสดงผล
ส่วนเมธอด valueOf(..) เป็นเมธอดที่กำหนดไว้ในคลาส String ซึ่งกำหนดให้เป็น public
final ดังนั้นจึงไม่สามารถนำไปสร้างคลาสล่าง (subclass) ได้ เมธอดนี้จึงไม่มีโอกาสที่จะถูก
override เมธอด valueOf() ใช้สำหรับแปลงข้อมูลพื้นฐานครั้งละ 1 ตัวเท่านั้น ให้เป็น
String และเป็น static method จึงไม่สามารถยุ่งเกี่ยวกับข้อมูลใดๆ ภายในอ๊อบเจ็กท์ได้
มันทำหน้าที่แปลงข้อมูลที่ส่งเข้าไปเป็นพารามิเตอร์เท่านั้น แต่ถูก overload ไว้หลายตัวให้รับพารามิเตอร์เป็นข้อมูลพื้นฐานหลากหลายชนิด
เมธอดนี้จะถูกเรียกใช้โดยอัตโนมัติเมื่อมีการส่งข้อมูลพื้นฐานต่างๆ ไปให้เมธอด
print() หรือ println() เพราะว่าเมธอด print() ต้องการข้อมูลประเภท String แต่เพื่ออำนวยความสะดวกให้กับผู้เขียนโปรแกรมจะได้ไม่ต้องแปลงข้อมูลเองให้ยุ่งยาก
เขาจึงออกแบบภาษาให้เมธอด print() รับพารามิเตอร์ที่เป็น type พื้นฐานที่ไม่ใช่
String ได้ โดยคอมไพเลอร์จะเป็นผู้เรียกเมธอด valueOf() แทนโปรแกรมเมอร์เสียเอง
เช่นถ้าตัวแปร a เป็น int การใช้ข้อความสั่ง System.out.print(a) คอมไพเลอร์จะแทรกการใช้เมธอด
valueOf() แทนเราดังนี้
System.out.print(String.valueOf(a)) เพื่อช่วยให้โปรแกรมเมอร์เขียนโปรแกรมสั้นลงนั่นเอง