จากงาน
Thailand Developer Konference #1 ของกลุ่ม
Thailand Kotlin Android Developer
มีหลายเรื่องที่น่าสนใจ
ไม่ว่าจะเป็น feature ของภาษา
Kotlin
ไม่ว่าจะเป็นการนำมาพัฒนา Android app
ไม่ว่าจะเป็นการใช้งานร่วมกับ Android Studio
แต่ขอทำการสรุปเรื่อง feature ที่น่าสนใจของภาษา Kotlin ไว้นิดหน่อย
ที่สำคัญสามารถนำมาพัฒนา Android app ได้แบบสบาย ๆ นะ
เหตุผลแสดงดังรูป
ปัญหาของ Null ในภาษา Java นั้นจัดการลำบากบาก ๆ
แน่นอนว่าทำให้เจอปัญหา
NullPointerException (NPE) บ่อยมาก !!
รวมทั้งใน code มีการตรวจสอบค่า Null ของตัวแปรต่าง ๆ วุ่นวายไปหมด
ซึ่งเป็นหนึ่งในความผิดพลาดของภาษาโปรแกรม
ดังนั้น Kotlin จึงออกแบบมาเพื่อแก้ไขปัญหานี้
ให้สามารถกำหนดได้ว่ามีข้อมูลชนิดใด ตามความต้องการ เช่น
มาดูตัวอย่างกัน เริ่มด้วย Non-null
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="nonnull.kt"]
ดังนั้นจึงไม่สามารถกำหนดค่า Null ให้กับตัวแปรที่เป็น Non-null ได้
ทำให้ code ปลอดภัยมากขึ้นเยอะ
ต่อมาคือ Nullable นั่นคืออนุญาตให้เป็นค่า Null ได้
แต่จะมีปัญหาตามมาก็คือ
ถ้ามีการเรียกใช้ method/property ของตัวแปรนั้น ๆ
จะเกิด error ตอน compile ขึ้นมา
สามารถเขียนได้ดังนี้
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="nullable.kt"]
จาก error message จะบอกวิธีการแก้ไขให้แล้ว
ซึ่งมี 2 วิธีที่ให้ผลที่แตกต่างกัน
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="nullable02.kt"]
จากเอกสารอธิบายเพิ่มอีกว่าสามารถใช้ Safe call แบบต่อ ๆ กันได้ด้วย
ซึ่งผลการทำงานจะได้ค่า Null กลับมา
ไม่เกิด NullPointerException นะ เมื่อทำการเรียกใช้งาน property/method ของ null object
แสดงดังตัวอย่าง
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="nullable_chain.kt"]
บ่อยครั้งที่ระบบต้องทำงานกับข้อมูลที่ Non-null เท่านั้น
แต่ในชุดของข้อมูลกลับมีบางตัวที่เป็น Null
ดังนั้นเราสามารถกรองข้อมูลเหล่านั้นออกไปด้วยการใช้ let
แสดงดังตัวอย่าง
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="filter_null_01.kt"]
ซึ่งจะพบว่าเกิด Error ขึ้นมาเมื่อเจอกับข้อมูลที่เป็น Null
แต่ถ้าไม่ต้องการเราสามารถกรองออกไปได้ ดังนี้
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="filter_null_02.kt"]
หรืออาจจะใช้งานผ่าน Collection ก็ได้นะ
ซึ่งมี method filterNotNull() ให้ใช้งานดังนี้
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="filter_null_03.kt"]
ทำให้การเขียน code ง่ายและสะดวกมากยิ่งขึ้น
ยังไม่พอนะเรื่องของ Null Safety
เช่นถ้าเราพยายาม cast type ของข้อมูลที่ผิด ๆ แล้ว
มักจะเกิด ClassCastException ขึ้นมา
แต่ใน Kotlin นั้นจะทำการ return ค่า null ออกมาให้ ดังนี้
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="cast_null.kt"]
เยอะจริง ๆ แต่มีประโยชน์มาก
Enum ใน Java นั้นใช้กันน้อยมาก
เนื่องจากความสามารถของ Enum ไม่เยอะเท่าไร รวมทั้งใช้งานยาก
แต่ใน Kotlin นั้นทำให้ใช้งานง่ายและมีประโยชน์
สำหรับคนที่เขียนภาษา Swift มาคงไม่แปลกใจเท่าไร
เนื่องจากมันเหมือนกันเลย
ในการใช้งานเบื้องต้นคือ การกำหนดค่าคงที่ขึ้นมา
ซึ่งเราสามารถกำหนดค่าให้ได้
แถมประกาศ Anonymous class ข้างในได้อีก
ตัวอย่างเช่นเรื่องของเพศ (Gender)
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="enum.kt"]
ต่อมาเรื่องของ Immutable ของตัวแปรต่าง ๆ ซึ่ง build-in มาใน Kotlin เลย
ซึ่งมีทั้ง mutable และ immutable
หลาย ๆ คนฟังแล้วก็อาจจะงงว่ามันคืออะไรกัน ?
อธิบายง่าย ๆ คือ ตัวแปรที่เป็น immutable คือ ไม่สามารถกำหนดค่าซ้ำได้
ดังนั้นค่าของตัวแปรจะไม่มีการเปลี่ยนแปลงเลย
ถ้าใครพยายามจะทำการแก้ไข จะ compile error ทันที
ส่วน mutable ก็ตรงกันข้าม ทำอะไรกับมันก็ได้
โดยตัวแปรที่ต้องการให้เป็น immutable ก็ประกาศด้วย
val เท่านั้นเอง
ส่วน mutable ก็ใช้
var ไป ดังนี้
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="immutable.kt"]
โดย property ใน class นั้นมีอยู่ 2 แบบ คือ
- ถ้าต้องการให้เป็นแบบ read-only ก็ประกาศด้วย val
- ถ้าต้องการทั้ง read และ write หรือ mutable ก็ประกาศด้วย var
ส่วนการเรียกใช้งาน property ต่าง ๆ
สามารถเรียกใช้ผ่านชื่อ property ได้เลยดังนี้
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="Person.kt"]
แต่ถ้าต้องการกำหนด getter/setter ในแต่ละ property ก็ทำได้ง่าย ๆ ดังนี้
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="Person02.kt"]
ยังไม่พอนะ มีเรื่องของ Delegate Property อีก
เป็นความสามารถที่น่าสนใจก็คือ
เราสามารถเฝ้าดูการเปลี่ยนแปลงค่าของ property ต่าง ๆ ได้ (Observable)
ตัวอย่างเช่นเฝ้าดูการเปลี่ยนค่าของ firstName ใน Person
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="Person03.kt"]
จากความสามารถนี้เราสามารถนำไปใช้ประโยชน์ได้อย่างมาก
เช่นเมื่อเกิดการเปลี่ยนแปลงค่าต่าง ๆ จะให้ทำอะไรบ้าง
ถ้าเป็นแบบปกติเราต้องสร้าง interface และ implement code ให้วุ่นวายกันอย่างมาก
แต่ใน Kotlin ได้เตรียมไว้ให้หมดแล้ว
สำหรับ 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 อื่น ๆ ได้
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="Dataclass.kt"]
ใน Kotlin นั้นสามารถเพิ่มความสามารถเพิ่มเติมของ class ต่าง ๆ
ด้วยการใช้งาน extension
โดยไม่ต้องมาทำการ inheritance อีกต่อไป
ตัวอย่างเช่น ถ้าต้องการเพิ่มความสามารถของ Int
ด้วยการเพิ่ม Day() และ Hour() สำหรับการแปลงวันเป็นชั่วโมง
ทำให้ code เราอ่านง่าย และ เข้าใจง่ายขึ้น
แถมสะดวกอีกด้วย ดังตัวอย่าง
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="Extension.kt"]
ปล. ความสามารถยังมีอีกเยอะเลย
ลองไปศึกษาเพิ่มเติมได้จาก Kotlin Document Reference
รวมทั้งฝึกเขียน Kotlin ผ่าน web ที่ Try Kotlin
ยังไม่พอนะ Kotlin ยังสามารถนำไปพัฒนาระบบต่าง ๆ ได้เช่น
มีข้อดีก็ย่อมต้องมีข้อเสียกันด้วย
ทั้ง community ที่ยังมีขนาดเล็กอยู่
ทั้งเรื่องความเข้ากันได้กับ library บางตัวเช่น Mockito
ปัญหาและอุปสรรคสำคัญของการนำ Kotlin มาใช้ไม่ใช่เรื่องของ feature นะ
แต่มันคือเรื่องของคนล้วน ๆ
ทั้งการโน้มน้าวให้หัวหน้าเชื่อ
ทั้งการโน้มน้าวให้ทีมเชื่อ
และตัวคุณเอง !!
สามารถดูเพิ่มเติมได้จาก