kotlin-01
จากงาน Thailand Developer Konference #1 ของกลุ่ม Thailand Kotlin Android Developer
มีหลายเรื่องที่น่าสนใจ
ไม่ว่าจะเป็น feature ของภาษา Kotlin
ไม่ว่าจะเป็นการนำมาพัฒนา Android app
ไม่ว่าจะเป็นการใช้งานร่วมกับ Android Studio
แต่ขอทำการสรุปเรื่อง feature ที่น่าสนใจของภาษา Kotlin ไว้นิดหน่อย

ที่สำคัญสามารถนำมาพัฒนา Android app ได้แบบสบาย ๆ นะ
เหตุผลแสดงดังรูป

kotling-02

เริ่มจาก Null Safety

ปัญหาของ Null ในภาษา Java นั้นจัดการลำบากบาก ๆ
แน่นอนว่าทำให้เจอปัญหา NullPointerException (NPE) บ่อยมาก !!
รวมทั้งใน code มีการตรวจสอบค่า Null ของตัวแปรต่าง ๆ วุ่นวายไปหมด
ซึ่งเป็นหนึ่งในความผิดพลาดของภาษาโปรแกรม
ดังนั้น Kotlin จึงออกแบบมาเพื่อแก้ไขปัญหานี้
ให้สามารถกำหนดได้ว่ามีข้อมูลชนิดใด ตามความต้องการ เช่น

  • Non-null
  • Nullable

มาดูตัวอย่างกัน เริ่มด้วย Non-null

ดังนั้นจึงไม่สามารถกำหนดค่า Null ให้กับตัวแปรที่เป็น Non-null ได้
ทำให้ code ปลอดภัยมากขึ้นเยอะ

ต่อมาคือ Nullable นั่นคืออนุญาตให้เป็นค่า Null ได้
แต่จะมีปัญหาตามมาก็คือ
ถ้ามีการเรียกใช้ method/property ของตัวแปรนั้น ๆ
จะเกิด error ตอน compile ขึ้นมา
สามารถเขียนได้ดังนี้

จาก error message จะบอกวิธีการแก้ไขให้แล้ว
ซึ่งมี 2 วิธีที่ให้ผลที่แตกต่างกัน

จากเอกสารอธิบายเพิ่มอีกว่าสามารถใช้ Safe call แบบต่อ ๆ กันได้ด้วย
ซึ่งผลการทำงานจะได้ค่า Null กลับมา
ไม่เกิด NullPointerException นะ เมื่อทำการเรียกใช้งาน property/method ของ null object
แสดงดังตัวอย่าง

บ่อยครั้งที่ระบบต้องทำงานกับข้อมูลที่ Non-null เท่านั้น
แต่ในชุดของข้อมูลกลับมีบางตัวที่เป็น Null
ดังนั้นเราสามารถกรองข้อมูลเหล่านั้นออกไปด้วยการใช้ let
แสดงดังตัวอย่าง

ซึ่งจะพบว่าเกิด Error ขึ้นมาเมื่อเจอกับข้อมูลที่เป็น Null
แต่ถ้าไม่ต้องการเราสามารถกรองออกไปได้ ดังนี้

หรืออาจจะใช้งานผ่าน Collection ก็ได้นะ
ซึ่งมี method filterNotNull() ให้ใช้งานดังนี้

ทำให้การเขียน code ง่ายและสะดวกมากยิ่งขึ้น

ยังไม่พอนะเรื่องของ Null Safety 
เช่นถ้าเราพยายาม cast type ของข้อมูลที่ผิด ๆ แล้ว
มักจะเกิด ClassCastException ขึ้นมา
แต่ใน Kotlin นั้นจะทำการ return ค่า null ออกมาให้ ดังนี้

เยอะจริง ๆ แต่มีประโยชน์มาก

ต่อมาเรื่องของ Enum Class

Enum ใน Java นั้นใช้กันน้อยมาก
เนื่องจากความสามารถของ Enum ไม่เยอะเท่าไร รวมทั้งใช้งานยาก
แต่ใน Kotlin นั้นทำให้ใช้งานง่ายและมีประโยชน์
สำหรับคนที่เขียนภาษา Swift มาคงไม่แปลกใจเท่าไร
เนื่องจากมันเหมือนกันเลย

ในการใช้งานเบื้องต้นคือ การกำหนดค่าคงที่ขึ้นมา
ซึ่งเราสามารถกำหนดค่าให้ได้
แถมประกาศ Anonymous class ข้างในได้อีก
ตัวอย่างเช่นเรื่องของเพศ (Gender)

ต่อมาเรื่องของ Immutable ของตัวแปรต่าง ๆ ซึ่ง build-in มาใน Kotlin เลย

ซึ่งมีทั้ง mutable และ immutable
หลาย ๆ คนฟังแล้วก็อาจจะงงว่ามันคืออะไรกัน ?
อธิบายง่าย ๆ คือ ตัวแปรที่เป็น immutable คือ ไม่สามารถกำหนดค่าซ้ำได้
ดังนั้นค่าของตัวแปรจะไม่มีการเปลี่ยนแปลงเลย
ถ้าใครพยายามจะทำการแก้ไข จะ compile error ทันที
ส่วน mutable ก็ตรงกันข้าม ทำอะไรกับมันก็ได้

โดยตัวแปรที่ต้องการให้เป็น immutable ก็ประกาศด้วย val เท่านั้นเอง
ส่วน mutable ก็ใช้ var ไป ดังนี้

ต่อมาเรื่องของ Properties และ Fields ใน Class ต่าง ๆ

โดย property ใน class นั้นมีอยู่ 2 แบบ คือ

  1. ถ้าต้องการให้เป็นแบบ read-only ก็ประกาศด้วย val
  2. ถ้าต้องการทั้ง read และ write หรือ mutable ก็ประกาศด้วย var

ส่วนการเรียกใช้งาน property ต่าง ๆ
สามารถเรียกใช้ผ่านชื่อ property ได้เลยดังนี้

แต่ถ้าต้องการกำหนด getter/setter ในแต่ละ property ก็ทำได้ง่าย ๆ ดังนี้

ยังไม่พอนะ มีเรื่องของ Delegate Property อีก

เป็นความสามารถที่น่าสนใจก็คือ
เราสามารถเฝ้าดูการเปลี่ยนแปลงค่าของ property ต่าง ๆ ได้ (Observable)
ตัวอย่างเช่นเฝ้าดูการเปลี่ยนค่าของ firstName ใน Person

จากความสามารถนี้เราสามารถนำไปใช้ประโยชน์ได้อย่างมาก
เช่นเมื่อเกิดการเปลี่ยนแปลงค่าต่าง ๆ จะให้ทำอะไรบ้าง
ถ้าเป็นแบบปกติเราต้องสร้าง interface และ implement code ให้วุ่นวายกันอย่างมาก
แต่ใน Kotlin ได้เตรียมไว้ให้หมดแล้ว

ต่อมาคือเรื่องของ Data Class

สำหรับ class ที่สร้างขึ้นมาสำหรับเก็บข้อมูลต่าง ๆ (Data class)
ซึ่งเรามักจะเรียกว่า
POJO บ้าง
Data Object บ้าง
Transfer Object บ้าง
Bean class บ้าง
Entity class บ้าง

โดยมีส่วนการทำงานต่าง ๆ เหมือนกัน และ ต้องเขียน code ซ้ำ ๆ เช่น

  • Constructor และ overload constructor
  • Getter/Setter method
  • Equals() method
  • HashCode() method
  • toString() method
  • การ copy

ซึ่งมันเป็นเรื่องที่น่าเบื่อหน่ายอย่างมาก
บางคนก็บอกว่าใช้เครื่องมือช่วย generate code สิ
แต่ code มันก็เยอะเหมือนเดิม
ดังนั้นใน Kotlin จึงเตรียมสิ่งต่าง ๆ เหล่านี้ไว้ให้ใน Data class

โดยที่ Data class จะต้องมีคุณสมบัติต่าง ๆ ดังนี้

  • ใน constructor จะต้องมี parameter อย่างน้อย 1 ตัว
  • ในการประกาศ parameter ต้องกำหนดว่าเป็น immutable หรือ mutable ด้วย val หรือ var เสมอ
  • Data class ไม่สามารถเป็น abstract class ได้
  • Data class ไม่สามารถ extend จาก class อื่น ๆ ได้

ปิดด้วย Extension function ก็แล้วกัน

ใน Kotlin นั้นสามารถเพิ่มความสามารถเพิ่มเติมของ class ต่าง ๆ
ด้วยการใช้งาน extension
โดยไม่ต้องมาทำการ inheritance อีกต่อไป

ตัวอย่างเช่น ถ้าต้องการเพิ่มความสามารถของ Int
ด้วยการเพิ่ม Day() และ Hour() สำหรับการแปลงวันเป็นชั่วโมง
ทำให้ code เราอ่านง่าย และ เข้าใจง่ายขึ้น
แถมสะดวกอีกด้วย ดังตัวอย่าง

ปล. ความสามารถยังมีอีกเยอะเลย
ลองไปศึกษาเพิ่มเติมได้จาก Kotlin Document Reference
รวมทั้งฝึกเขียน Kotlin ผ่าน web ที่ Try Kotlin

ยังไม่พอนะ Kotlin ยังสามารถนำไปพัฒนาระบบต่าง ๆ ได้เช่น

มีข้อดีก็ย่อมต้องมีข้อเสียกันด้วย

ทั้ง community ที่ยังมีขนาดเล็กอยู่
ทั้งเรื่องความเข้ากันได้กับ library บางตัวเช่น Mockito
ปัญหาและอุปสรรคสำคัญของการนำ Kotlin มาใช้ไม่ใช่เรื่องของ feature นะ
แต่มันคือเรื่องของคนล้วน ๆ
ทั้งการโน้มน้าวให้หัวหน้าเชื่อ
ทั้งการโน้มน้าวให้ทีมเชื่อ
และตัวคุณเอง !!

สามารถดูเพิ่มเติมได้จาก