วันเสาร์ที่ 28 กุมภาพันธ์ พ.ศ. 2558

ชวนคุยจาวา part 6 : คำถามของ protected modifier

>> หลังจากเรียนรู้จาวาส่วนแรกกับพี่นรินทรไปแล้ว ผมก็ไม่ได้เขียนเรื่องจาวาพื้นฐานเพิ่มอีกเลยเป็นเวลายาวนานมาก สองสามวันที่ผ่านมาหัวหน้าแอบมาถามเพื่อนสาวผมว่า 'เราใช้ protected กับคลาสได้ไหม' เพื่อนสาวก็เอามาถามผมอีกที ผมคิดได้ในขณะนั้นทันทีว่า อ่อ ที่แท้มันสำคัญอย่างนี้

>> เพื่อนๆหลายคนรู้ดีว่าภาษานี้มี modifier อยู่สองประเภทใหญ่ๆ คือ
- Java Access Modifiers และ
- Java Non Access Modifiers

>> เน้นไปที่แบบ access modifiers ได้แก่
- Private Access
- Default Access
- Protected Access
- Public Access

>> คืออย่างนี้ครับ งานที่เป็น common นั้นมันจำเป็นต้องใช้เกือบทุก module สมมติว่างานของเรามี Financial Module, Supply Chain Module, Human Resource Module และ Customer Relationship Module การจะพัฒนา module ไหน จำต้อง include เจ้า Common Module มาด้วย (สมมติไง) คลาสที่เป็น general common ใน Common Module จะถูกหยิบไปใช้ ตรงกันข้ามคลาสที่เป็นของ module อื่นที่ไม่ใช่ common เจ้า Common Module จะต้องไม่เรียกใช้โดยเด็ดขาด งานลักษณะแบบนี้เขาจึงมัก design ให้ประดาคลาส general common ดังกล่าวเป็นตัวที่ต้องถูกสืบทอดไปใช้ (ไม่ถึงขนาดบีบบังคับ)

>> กล่าวคือ general common classes จะถูกนิยามด้วย protected ไม่ว่าจะเป็น data member หรือ method member หรือ inner class

>> ทีนี้กลับมาที่คำถามของหัวหน้าที่ว่า 'เราใช้ protected กับคลาสได้ไหม' คำตอบนั้นเพื่อนๆคงทราบแล้วจากข้อมูลข้างต้นว่า ไม่ได้ จะใช้ได้กับ data member หรือ method member หรือ inner class เท่านั้น (เท่าที่ผมทราบตอนนี้นะ ตกหล่นขออภัยยิ่ง)

>> ด้วยเหตุนี้ทำให้ผมนึกถึงอีกคำถามหนึ่งของรุ่นน้องที่มหาวิทยาลัย เขาถามว่า 'เนี่ย โค้ดของผมสามารถเข้าถึงสมาชิกของคลาสที่ประกาศ protected ได้ไม่ต่างจาก public เลยพี่ แล้วมันยังไงพี่' คำตอบในตอนนั้นก็คือ ถูกต้องครับ ถ้าเราตัดการสืบทอด (Extend) ออกไปแล้วใช้ protected modifier กับสมาชิกของคลาส ผลมันจะไม่ต่างจาก public modifier ซึ่งถูกต้องแน่แท้ แต่น้องลืมเรื่อง package ไป

>> จากนิยามที่ว่า protected : can only be accessed by classes in the same package or sub classes of this class. นี่แหละคือคำตอบที่น้องต้องการ protected มีผลกับคลาสลูกที่ไปสืบทอด data member หรือ method member หรือ inner class ที่มี modifier เป็น protected และจะเห็นผลอย่างชัดเจนเมื่อคลาสลูกดังกล่าวนั้นอยู่ต่าง package กับคลาสแม่ (ถ้าลูกกับแม่อยู่ package เดียวกัน ยังไงมันก็เห็นกันไม่ต่างจาก public อยู่แล้ว) พูดง่ายๆว่า คลาสที่เข้าถึงสมาชิกของแม่ได้ต้องเป็นลูกของแม่เท่านั้น โดยมีผลในทุก package

>> กลับมาที่ general common classes เมื่อมี package เป็นของตัวเอง สมมติว่าชื่อ common คลาสใดๆก็ตามที่สืบทอดจาก general common class เหล่านี้ก็สามารถเข้าถึงสมาชิกที่เป็น protected ได้นั่นเองครับ จบแล้วจ้า

ไม่มีความคิดเห็น:

แสดงความคิดเห็น