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 แล้วช่างใหญ่เทอะทะนัก เห้อ ลงใช้คู่กันเลยละกันเนอะ
Filed under ภาษาเครื่องกล | No Comments »




