Kotlin Extension Function ภารกิจพิทักษ์จักรวาลลลลลล ~~~~ Vol.1
ก่อนอื่นเลยต้องขอบอกก่อนว่า เพิ่งได้มีโอกาสเขียนและใช้งาน Kotlin อย่างจริงจังได้ไม่นานหนัก และเมื่อเริ่มใช้งานไปได้ซักพัก ก็รู้สึกว้าวววว กับเจ้าตัว Extension Function ของ Kotlin เป็นอย่างมาก จึงเป็นที่มาของสิ่งที่จะพูดถึงในวันนี้
มาเริ่มกันเลยยย !~
Extension Function นั้นอยู่ใน Kotlin standard library ซึ่งเราสามารถนำมาใช้งานได้เลย Extension Function ถ้าให้พูดง่ายๆและสั้นที่สุด มันก็เหมือนกับ การที่เราสามารถขยายความสามารถหรือเพิ่มฟังก์ชันเข้าไปใหม่ให้กับ Class ตามที่เราต้องการนั้นเอง ตัวอย่างเช่น
fun String.toMinute() = "$this Minutes"
fun main(args: Array<String>) {
val countDown = "29"
println(countDown.toMinute()) // "29 Minutes"
}
จากตัวอย่างด้านบน ก็เป็นการเพิ่มความสามารถให้กับ String ให้สามารถมีข้อความต่อท้ายในตัว String เองได้ จะเห็นได้ว่าสั้นและใช้งานง่ายมากๆ แต่ถ้าเป็น Java เราคงต้องเขียนกันแบบ Utility method ซึ่งก็หน้าจะรู้กันอยู่แล้วว่าจะเป็นแบบไหน ฮ่าๆ มาดูต่อกันอีกซักตัวอย่างนึง
// Utility method in Java
public static String formatDDMMYYYY(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
return sdf.format(date);
}// Extension Function in Kotlin
fun Date.formatDDMMYYYY(): String {
val sdf = SimpleDateFormat("dd-MM-yyyy")
return sdf.format(this)
}
จะเห็นได้ว่า การเรียกใช้งานแบบ Extension Function ที่เรียกใช้ Class Date ในการเปลื่ยน format นั้นมีความเรียบง่าย ดูน่าใช้งานและสามารถใช้งานได้หลากหลายกว่า Utility Class ที่ต้องประกาศ Static method
นอกจากนี้ยังมี Extension properties อีกด้วย ตัวอย่างการใช้งานเช่น ถ้าเราต้องการจะหา Index สุดท้ายของ List ที่เราใช้งาน เราก็ต้องใช้ list.size -1 แบบนี้ในทุกๆที่ ที่เราเรียกใช้งานตลอด แต่ถ้าเราสร้าง properties เป็นของตัวเอง แบบนี้ละ
val <T> List<T>.lastIndex: Int
get() = this.size - 1// How to use
val numbers = listOf("1", "2", "3")
println("Last number index is ${numbers.lastIndex}")
มันจะทำให้เราสร้าง properties แค่ที่เดียว แต่สามารถเรียกใช้งาน .lastIndex() ได้ทุกที่ ที่เราต้องการเลย สะดวกไหมละ !!
หรือถ้าเราต้องการ First element ของ List ตัวที่เราทำงานกับมันอยู่ละ จะต้องมาใช้ list[0] ในทุกๆที่เลยใช่ไหม คำตอบคือใช่ 5555 แต่ถ้าเราสร้าง properties เพิ่มขึ้นอีกซักตัว หน้าตาประมานนี้
fun <T> List<T>.first(): T {
if (isEmpty())
throw NoSuchElementException("List is empty.")
return this[0]
}//How to use
val names = listOf("Mike", "Pepo", "Louis")
println("The best friend is ${names.first()}")
ดูสั้นๆ แต่ทรงพลัง เพียงเท่านี้เราก็สามารถ ใช้ .first() กับ List ที่เราต้องการข้อมูลของมันได้แล้ว แถมยังสามารถใช้งานได้จากทุกที่อีกด้วยเยี่ยมจริง ๆ
ทั้งนี้อยากแนะนำว่าควรจะสร้างไฟล์ Extensions.kt แยกไว้ สำหรับเก็บ Extensions Function เพื่อที่ Class ต่างๆ ที่เราสร้าง Extensions ไว้จะได้สามารถเรียกใช้งานได้จากทุกๆที่อยู่ใน package เดียวกัน
สรุป
Kotlin Extension ทั้ง Function/Properties เป็นสิ่งอำนวยความสะดวกที่จะช่วยให้นักพัฒนาอย่างพวกเรา ง่ายต่อการเขียน Code และเพิ่มความสามารถให้หลากหลายและเหมาะกับการทำงานของเรา ส่วน Vol. ต่อไป เราจะมาดู Extension ที่น่าสนใจและเราน่าจะได้ใช้งานบ่อยๆกัน หวังว่าเพื่อนๆคงได้ประโยชน์จากบทความนี้กันนะครับ สำหรับวันนี้ขอบคุณครับ บรัยย~~!
ถ้ายังอยากจะอ่านต่อ ก็สามารถไปอ่านต่อกันจากลิ้งค์ด้านล่างได้เลยครับ ^ ^