Anonymous คลาสกับการเพิ่มและเรียกใช้ method

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 มาเปิดดูอ่ะนะ :lol: ) แล้วก็ได้ผลลัพธ์ตามด้านล่าง

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 คลาสเพื่อมาเรียกภายหลังอีกแล้ว แต่ดูโค้ดแล้วอาจจะแปลกๆ หน่อยเท่านั้นเอง :lol:

ปอลอ. ช่วงนี้เขียนแต่จาวาพื้นๆ แฮะ แต่ framework ทั้งหลายแหล่ของจาวาเห็นแล้วมันชวนปวดหัวดีเหลือเกินนี่นา
ปอลอสอง. netbeans6 beta1 ออกแล้ววันนี้พร้อมกับฝั่ง eclipse ที่ PDT ก็ออกมาแล้วเช่นกัน เลยตัดสินใจไม่ถูกเลยจะใช้ IDE ตัวไหนดีเพราะชอบ netbeans ที่ตัวเล็กโคตรๆ (Java SE Edition 22 MB) เทียบกับ eclipse แล้วช่างใหญ่เทอะทะนัก เห้อ ลงใช้คู่กันเลยละกันเนอะ



Comments

No comments yet.

Add Yours

  • Author Avatar

    YOU


Comment Arrow



About Author

llun

Apple addict programmer