เป็นยังไงครับรู้สึกอยากด่าหรืออยากเลิกใช้ Java ไปเลยไหมครับ คราวนี้ทำไมจึงเป็นเช่นนี้ พิธีกรเขาให้เหตุผลว่าในสมัยก่อนที่มีการสร้างคลาสนี้ยังไม่มีแนวคิดของการที่มีชื่อ URL ที่ต่างกัน แต่อ้างถึงหมายเลข IP เดียวกัน
วิธีการแก้ไขถ้าต้องการให้ได้ผลลัพธ์ที่เหมือนเดิมเสมอไม่ว่าจะต่ออินเทอร์เน็ตหรือไม่ ให้ใช้คลาสที่ชื่อ URI แทนครับ ดังนั้นโปรแกรมในตอนต้นจะต้องเปลี่ยนเป็นดังนี้ครับ
import java.net.*; import java.util.*; public class URISet { private static final String[] URI_NAMES = { "//www.google.com", "//www.ajsarun.blogspot.com", "//www.ajsarun.bloggang.com", "//ajsarun.blogspot.com", "//kisarun.multiply.com", "//www.google.com" }; public static void main(String[] args) { Set favorites = new HashSet(); for(String uriName: URI_NAMES) { favorites.add(URI.create(uriName)); } System.out.println(favorites.size()); } }
ซึ่งคลาส URI นี้จะพิจารณาโดยใช้สตริงเท่านั้น คือไม่มีการไปแปลงเป็นหมายเลข IP ใด ๆ ดังนั้นผลลัพธ์จะเป็น 5 เสมอ แต่ก็ยังเป็นการเปรียบเทียบแบบไม่สนใจตัวอักษรตัวเล็กหรือตัวใหญ่เช่นเดิมนะครับคือ //www.google.com กับ //www.GOOGLE.COM ก็ถือว่าเท่ากัน
สิ่งที่พิธีกรเขาสรุปจากปริศนานี้ก็คือ เขาบอกว่าเราไม่ควรใช้ URL กับ class SET หรือ class MAP เพราะว่ามันออกแบบมาไม่ดี ให้ใช้ URI แทน ซึ่งตรงนี้ผมว่าถ้าใครไม่ได้เขียนโปรแกรมที่เกี่ยวข้องกับเรื่องพวกนี้ก็อาจดูจะไกลตัวไปนะครับ
ไม่ค่อยได้ใช้ Class URI จึงไม่ทราบเลยว่า มีการไปตรวจสอบ equals ที่เป็น ip จริงๆด้วย
ผมใช้การ overide equals บ่อยสำหรับ obj ที่สร้างเอง
คงต้องระวัง ไม่ให้เปลี่ยนไปตามสภาพ เช่น ต่อเน็ท หรือ ไม่ต่อ ครับ
ขอบคุณกับความรู้ดีๆครับผม