Java concurrent
เขียน MSN Client ง่ายๆ ด้วยจาวา
ตั้งแต่ทำงานมารู้สึกได้เจอของเล่นแปลกๆ เยอะแยะเต็มไปหมด เล่นได้แทบทุกเดือนไม่มีเบื่อ เมื่อวานต้องทำเกี่ยวกับ MSN เลยต้องไปหาเครื่องมือมาใช้ ตอนแรกพี่แนะนำว่าให้ไปดูจาก php แต่ลองขุดๆ เขี่ยๆ ดูปรากฏว่าใช้งานจริงไม่ได้ สุดท้ายเลยหาของจาวาโดยเฉพาะออกมา แล้วก็เจอตัวนี้เข้า Java-JML (Java MSN Messenger Library) ความสามารถมันก็พอตัวเลย ทำหน้าที่เหมือนไคลเอ็นท์ MSN ได้ทุกอย่าง สามารถเอารายชื่อ ตั้ง status หรือแม้แต่สนทนากับคนอื่นเป็นกลุ่มหรือรายบุคคลก็ได้ โดยในเว็บจะมีโค้ดตัวอย่างตั้งแต่ เริ่มต่อเข้าไปยัง MSN การรับค่าสถานะจากคนอื่น การรับห้องที่คนอื่นชวน การดูว่าในห้องมีใครบ้าง แต่สิ่งหนึ่งที่อย่างไม่มีคือ การส่งข้อความไปหาคนอื่น ก็เลยมาเขียนตัวอย่างลงในบล๊อกเพิ่มอีกอัน เผื่อจะมีคนเอาไปดัดแปลงเล่นเป็นอย่างอื่น (ตอนนี้ก็คิดไว้ว่าจะทำเล่นหลายอย่างอยู่เหมือนกัน ) เริ่มจากสร้าง Object ที่ไว้ใช้ต่อและคุยกับเซิร์ฟเวอร์ก่อน messenger = MsnMessengerFactory.createMsnMessenger(email, password); messenger.getOwner().setInitStatus(MsnUserStatus.HIDE); messenger.setLogIncoming(true); messenger.setLogOutgoing(true); messenger.login(); อันนี้ดูจากตัวอย่างได้ทั่วไป จากนั้นเวลาที่ต้องการส่งข้อความก็แค่สั่งว่า Email email = Email.parseStr(“target@email”); [...]
Enum Factory
ไม่ได้เขียนลงบล๊อกนานวันนี้เลยรวบยอดเขียนสามเรื่องเลยละกัน อันนี้กะว่าบันทึกไว้เล่นๆ แบบว่า enum ในจาวาทำอย่างนี้ก็ได้นะ ก่อนอื่นก็ต้องอธิบายคร่าวๆ ก่อนสินะว่า factory คืออะไร มันก็คือรูปแบบของคลาส กับเมธอดที่ไว้ใช้สร้าง object ต่างๆ ปกติเวลาจะสร้าง object อะไรใน java หรือ .net หรืออะไรก็ตามที่มี oop จะใช้การ new ขึ้นมา สำหรับ factory ที่ว่าก็คือเมธอดหรือคลาสที่รวม new พวกนี้เอาไว้นั่นเอง เวลามีการเปลี่ยนแปลงอะไร จะได้ไม่ต้องแก้ใหม่หลายจุด ลองดู factory ปกติในจาวาดีกว่า class CarFactory { public static Car build(String brand) { if (brand.equals(“benz”)) return new LuxuryCar(); else if (brand.equals(“bmw”)) return new JamesBondCar(); else [...]
Switch กับ If-else อะไรเร็วกว่ากัน
เมื่อคืน pFz เอา url ที่เกี่ยวกับการเปรียบเทียบระหว่าง switch กับ if-else โดยคำตอบก่อนที่ pFz จะแจมไปก็คือ if-else เร็วกว่า แต่ pFz แย้งไปตรงข้ามเพราะ compiler ส่วนใหญ่จะมีการแต่ง switch ให้เร็วขึ้นโดยการแปลงเป็น hash table ซะ ดูไปก็ไม่รู้หรอกว่าอะไรจะเร็วกว่า เลยลองเขียน จาวากับซีมาทดลองดูให้เห็นกันไปเลย sourcecode: Java, C ผลสรุปก็คืออะไรจะเร็วกว่าอะไรขึ้นกับ จำนวนกรณีที่นำมาเปรียบเทียบยิ่งเยอะจะยิ่งเห็นผลชัด กรณีที่ตกลงไปในการเปรียบเทียบ จากโค้ดก็คือค่า cSample นั่นเอง โดยถ้าตกในกรณีแรกของ if หรือ case แน่นอน if จะเร็วกว่า แต่ถ้าตกกรณีหลังๆ switch จะเร็วกว่า ผลลัพธ์ เลขบนคือ switch เลขล่างคือ if-else Java, cSample = 0 llun@pluto:~/Desktop/test$ [...]
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 { [...]