รู้จักกับ Visibility Modifier ของ Kotlin ที่ไม่เหมือนกับ Java

Akexorcist
Black Lens
Published in
4 min readDec 20, 2019

ความเหมือนที่แตกต่าง

Visibility Modifier (Kotlin) == Access Modifier (Java)

ถ้าผู้อ่านคุ้นเคยกับ Java มาก่อน และยังมือใหม่มากๆกับ Kotlin ก็คงไม่คุ้นกับคำว่า Visibility Modifier ซักเท่าไรนัก แต่ถ้าบอกว่ามันคือ Access Modifier ของ Java ล่ะ? ร้องอ๋อขึ้นมาทันทีเลยใช่มั้ยล่ะ?

Visibility Modifier เป็นการกำหนดว่าจะให้ Class, Object, Interface, Constructor, Function หรือ Property ถูกมองเห็นและเรียกใช้งานจากได้ที่ไหนบ้าง เพื่อช่วยให้นักพัฒนาควบคุมการเข้าถึงและเรียกใช้งานของคำสั่งในแต่ละส่วนได้อย่างเหมาะสม โดยมีทั้งหมด 4 แบบคือ Public, Private, Protected และ Internal ซึ่งแต่ละแบบจะส่งผลแตกต่างกันไปโดยขึ้นอยู่กับตำแหน่งที่ประกาศไว้ในโค้ด

Visibility Modifier ในระดับ Top-level (Package)

ในภาษา Kotlin สิ่งที่สามารถประกาศในระดับ Top-level ได้ จะมี Class, Object, Interface, Function และ Property

ตัวอย่างคำสั่งที่สามารถประกาศใน Top-level ได้

โดย Visibility Modifier ในระดับ Top-level นั้นจะใช้ได้เพียงแค่ 3 แบบเท่านั้น คือ Public, Private และ Internal

Public (Top-level)

อะไรก็ตามที่ประกาศไว้เป็น Public จะสามารถเรียกใช้งานได้จากทุกที่ไม่ว่าโค้ดนั้นจะอยู่ที่ไหนก็ตาม

Private (Top-level)

การประกาศเป็น Private จะทำให้คำสั่งที่อยู่คนละไฟล์ไม่สามารถเรียกใช้งานได้เลย และคำสั่งที่อยู่ในไฟล์เดียวกันก็ถูกจำกัดให้เรียกใช้งานได้แค่ที่ระดับ Top-level เท่านั้น

และในการเรียกใช้งานก็จะมีเงื่อนไขว่าต้องทำให้สิ่งนั้นเป็น Private ด้วยวิธีใดวิธีหนึ่งด้วย

เช่น ผมสร้าง Private Class ที่ Top-level ขึ้นมา และเรียกใช้งานใน Class อื่นๆที่อยู่ในไฟล์เดียวกัน โดยสร้างเป็น Property และ Function ขึ้นมา ผมจะต้องทำให้ Class นั้นเป็น Private หรือ Property และ Function จะต้องเป็น Private ถึงจะเรียกใช้งานได้

Internal (Top-level)

Internal คือการกำหนดให้เรียกใช้งานได้เฉพาะไฟล์ที่อยู่ใน Module เดียวกันเท่านั้น ถ้าอยู่คนละ Module จะไม่สามารถเรียกใช้งานได้เลย

และในการเรียกใช้งานก็จะมีเงื่อนไขคล้ายๆกับ Private แต่จะแตกต่างกันเล็กน้อยตรงที่จะต้องทำให้เป็น Internal หรือ Private ก็ได้ (เพราะ Scope ของ Private ไม่ได้ขัดกับ Internal)

Visibility Modifier ในระดับ Class, Object และ Interface

ในระดับ Member ของ Class, Object และ Interface นั้น จะประกาศได้ทั้ง Class, Object, Interface, Function, Property และ Constructor (เฉพาะ Class)

ในระดับนี้จะมี Visibility Modifier ให้ประกาศได้ทั้งหมด 4 แบบ คือ Public, Private, Protected และ Internal

Public (Class, Object or Interface Member)

สำหรับการประกาศให้เป็น Public นั้นจะทำให้คำสั่งจากภายนอกสามารถเรียกใช้งานได้ โดย Function และ Properties จะเรียกผ่าน Instance ส่วน Class, Object หรือ Interface ที่อยู่ในนั้นจะเรียกได้โดยตรงเลย

และในกรณีที่เป็นระดับ Member ของ Class หรือ Interface ที่กำหนดเป็น Open เพื่อให้สามารถ Inherit ได้ ก็จะสามารถเรียก Function และ Property ได้โดยตรงเลย

Private (Class, Object or Interface Member)

เมื่อใดก็ตามที่ประกาศเป็น Private จะทำให้ไม่สามารถเข้าถึงจากภายนอกได้เลย เรียกใช้งานได้จากคำสั่งที่อยู่ข้างในตัวเองเท่านั้น ซึ่งไม่รวมไปถึง Inner Class/Object/Interface เช่นกัน

และถึงแม้ว่าจะ Inheritance จาก Class/Object/Interface นั้นๆก็ตาม ก็ไม่สามารถเข้าถึงสิ่งที่เป็น Private ได้เลย

Protected (Class, Object or Interface Member)

Protected มีไว้สำหรับกรณี Inheritance เท่านั้น ไม่อยากให้เรียกใช้งานจากภายนอกได้โดยตรง

โดย Object และ Interface จะไม่รองรับ Inheritance จะมีแค่ Class เท่านั้นที่ทำได้

จึงเหมาะกับคำสั่งบางอย่างที่ไม่อยากให้ถูกเรียกใช้งานจากภายนอก แต่ต้องการเปิดให้เรียกใช้งานได้เมื่อ Inherit จาก Class นั้นๆ

Internal (Class, Object or Interface Member)

การประกาศเป็น Internal จะเป็นทำให้สามารถเรียกใช้งานได้จาก Module เดียวกันเท่านั้น ถ้าอยู่คนละ Module จะเรียกใช้งานไม่ได้

เพิ่มเติม

  • ถ้าไม่ได้กำหนด Visibility Modifier จะถือว่าเป็น Public เสมอ จึงเป็นที่มาว่าทำไมเวลาใส่ Public แล้ว IDE แนะนำให้ลบทิ้ง
  • กำหนด Visibility Modifier ใน Local Property ไม่ได้
  • Outer Class จะมองไม่เห็น Private Member ที่อยู่ใน Inner Class

สิ่งที่นักพัฒนา Java ควรรู้เกี่ยวกับ Visibility Modifier ใน Kotlin

  • Default สำหรับ Visibility Modifier จะเป็น Public ไม่ได้เป็น Package-private แบบ Java
  • Top-level Declaration ไม่รองรับ Package-private แบบใน Java
  • ใน Kotlin จะมีการเพิ่ม Internal เข้ามา โดยเป็นการกำหนดให้สามารถมองเห็นและเรียกใช้งานได้จากคำสั่งที่อยู่ใน Module เดียวกันเท่านั้น ซึ่งมีประโยชน์มากเวลาทำโปรเจคที่มีขนาดใหญ่และแบ่งเป็น Multi-modules
  • Package-private ที่ประกาศไว้ในโค้ด Java จะมีผลเช่นเดียวกันกับโค้ด Kotlin หรือก็คือต้องอยู่ใน Package เดียวกันเท่านั้นถึงจะมองเห็นและเรียกใช้งานได้
  • เมื่อประกาศ Internal ไว้ในโค้ด Kotlin แล้วเรียกใช้งานในโค้ด Java สิ่งที่โค้ดฝั่ง Java มองเห็นจะกลายเป็น Public โดยทันที

ทั้งหมดทั้งมวลนี้ ถ้าผู้อ่านคุ้นเคยกับภาษา Java มามากพอ ก็จะพบว่า Visibility Modifer ของ Kotlin นั้นไม่ได้เข้าใจยากอย่างที่คิด โดยเฉพาะ Public, Protected และ Private ที่ทำงานเหมือนเดิมเป๊ะๆ ต่างกันตรงที่ไม่มี Private-package และมี Internal เพิ่มเข้ามาเท่านั้นเอง

และสุดท้าย อย่าลืมเลือกใช้ Visibility Modifier ให้เหมาะสมกับโค้ดแต่ละส่วนของเรานะครับ

--

--

Akexorcist
Black Lens

Lovely android developer who enjoys learning in android technology, habitual article writer about Android development for Android community in Thailand.