Anonymous คลาสในจาวาคือคลาสที่เขียนแทรกขึ้นมาโดยไม่มีชื่อเลย เวลาเรียกใช้ปกติก็จะผ่าน interface หรือ abstract class ที่เป็นต้นแบบทำให้มีข้อจำกัดอยู่สองสามอย่างคือ 1. ไม่มี constructor เนื่องจากการสร้าง constructor ในจาวาต้องรู้ชื่อคลาส ซึ่งมันไม่มีในคลาสแบบนี้แล้วมันจะไปสร้างได้ยังไงหละจริงมะ 2. ไม่สามารถเพิ่ม method ได้เพราะถึงเพิ่มไปก็ไม่รู้จะเรียกใช้ยังไงภายหลัง แต่วันนี้ผมจะมาแก้ปัญหาข้อสองหละ เพราะถ้าจะหลีกเลี่ยงโดยไปสร้าง Inner คลาสก็รู้สึกมันจะเยอะเกินไปอีก ใช้แค่นิดเดียวเอง ทำไมต้องสร้างคลาสใหม่ที่มีชื่อด้วยจริงมะ
มาดูโจทย์ผมเลยละกัน คือผมจะสร้าง Map แบบพิเศษที่ key 1 key สามารถเก็บค่าได้หลายค่า และสามารถเอาค่ามาหา key กลับได้ ถ้าลองหาดู Structure แบบนี้ที่มีอยู่แล้วก็จะไปเจอของ Apache Common Collection แต่อันนั้นมันอยู่แยกกันระหว่าง BidirectionMap กับ MultiValueMap อ่ะก็เลยต้องหาทางรวมกันซะเอง แล้วก็เจอปัญหาที่ method ด้านล่างนี้แหละ
class MultiValueBidirectionHashMap extends MultiValueBidirectionMap {
...
public Set {
entrySet() {
return null;
}
...
}
ตัว Map.Entry เป็น interface ที่ลองขุดๆ คุ้ยๆ ดูแล้วมันไม่มี implement ให้เรียกใช้ก็ต้องสร้าง implement ขึ้นมาเอง (จริงๆ อาจจะมีก็ได้ แค่ขี้เกียจเอา source ของ Collection มาเปิดดูอ่ะนะ
) แล้วก็ได้ผลลัพธ์ตามด้านล่าง
public Set {
entrySet() {
Set entrys = new HashSet();
for (K key : _keys) {
V valuesOfKey = values[key];
// _values เป็น Collection ที่เก็บค่าทั้งหมดที่อิงกับ key ไว้
for (V value : valuesOfKey) {
entrys.add(new Map.Entry() {
// implement interface method
...
// method that use to set key
public Map.Entry setKey(K key) {
// set the key that user pass to class key
...
return this;
}
}.setKey(key));
}
}
return entrys;
}
แค่นี้ก็ได้ method สำหรับใส่ค่าลงไปเพิ่ม พร้อมยัดค่าเข้าไปโดยไม่ต้องสร้าง inner คลาสเพื่อมาเรียกภายหลังอีกแล้ว แต่ดูโค้ดแล้วอาจจะแปลกๆ หน่อยเท่านั้นเอง
ปอลอ. ช่วงนี้เขียนแต่จาวาพื้นๆ แฮะ แต่ framework ทั้งหลายแหล่ของจาวาเห็นแล้วมันชวนปวดหัวดีเหลือเกินนี่นา
ปอลอสอง. netbeans6 beta1 ออกแล้ววันนี้พร้อมกับฝั่ง eclipse ที่ PDT ก็ออกมาแล้วเช่นกัน เลยตัดสินใจไม่ถูกเลยจะใช้ IDE ตัวไหนดีเพราะชอบ netbeans ที่ตัวเล็กโคตรๆ (Java SE Edition 22 MB) เทียบกับ eclipse แล้วช่างใหญ่เทอะทะนัก เห้อ ลงใช้คู่กันเลยละกันเนอะ