Convert Java into Kotlin 101
สวัสดีมิตรรักนักอ่านทุกท่านครับ พอดีผมได้มีโอกาสลงคลาส Kotlin ใน Udemy นานละ พอเรียนจบคลาสก็รู้สึกได้ว่า Kotlin นี่มันคือ Java ที่เสร็จแล้วชัด ๆ (ตั้งแต่ปีที่แล้ว ฮ่า ๆ)
ก็เลยมีความคิดว่าอยากจะใช้ Kotlin เป็นเรื่องเป็นราวดูบ้าง คืออยากใช้ Kotlin กับ Enterprise แต่ตัวเองยังไม่มีโอกาส อันที่จริงถ้าเป็น Dev ฝั่ง Android นี่เค้าจะใช้กันมานานแล้ว ไอเรามันไม่ตรงสาย ก็เลยยังหาโอกาสไม่ได้สักที…
ไหน ๆ ก็อยากจะเขียน Kotlin อยู่แล้ว ก็เลยถือโอกาสทบทวน แล้วก็เขียนบทความสั้น ๆ (เขีบนเสร็จกลับมาทวนอีกที อ่าวไม่สั้นละ) สักอันเพื่อตัวเอง และคนอื่น ๆ ที่อาจอยากจะลองเปลี่ยนจาก Java ไป Kotlin มันต้องทำอย่างไร แล้วมันมีอะไรบ้างที่เปลี่ยนไปบ้าง และมันคูลไหม…
Kotlin
เริ่มกันที่ Kotlin เลยแล้วกัน เมื่อประมาณปี 2011 บริษัท JetBrains เค้าไปเปิดตัว Project new language สำหรับ JVM ภายใต้ชื่อ Kotlin ขึ้นมา (ใช่แล้ว บริษัทที่ทำ IntelliJ IDEA ที่ทำให้ NetBean กับ Eclipse แตกซ่าน นั่นเอง)
โดยที่ Lead development ของโครงการนี้อย่างคุณ Andrey Breslav ได้กล่าวเอาไว้ว่า… Kotlin ถูกออกแบบมาให้เป็นภาษาเชิงวัตถุ (Object Oriented Programming) “ที่ดีกว่า Java” แต่ยังรองรับการทำงานร่วมกับ Source code ของ Java ได้ด้วย ทำให้การ Migration จาก Java into Kotlin เป็นไปได้ด้วยความไม่ยากลำบาก (“ที่ดีกว่า Java” แปลมาอีกทีไม่ได้คิดเอง ไม่ได้จะขิงภาษาที่ตัวเองรักมากนะ ฮ่า ๆ)
“A modern programming language that makes developers happier.
Open source forever” ที่ยกมานี่คือ Slogan ของพี่เค้าจาก Link
Designed: JetBrains
Developer: JetBrains
First appeared: 2011
Typing: Inferred, static, strong
Platform: JVM, JavaScript, LLVM
OS: Cross-platform
License: Apache License 2.0
Filename: “.kt”, “.kts”, “.ktm”
ปัจจุบันวันที่ผมเขียนบทความนี้ ตัว Kotlin ถูกพัฒนาไปจนถึง Version 1.4-M2
Kotlin เหมาะนำมาเขียนสำหรับทำ Mobile Cross-Platform, Native, Data Science, Server Side, Web development และ Android (จากเว็บผู้ผลิต)
โดยที่ไฟล์ ตระกูล “*.kt” จะถูกแปลงร่างออกเป็น “*.jar” ทำให้สามารถรันอยู่บน JVM ได้นั่นเอง
ทำไมไม่กล่าวถึง Java ด้วย… คือผมคิดว่าหาอ่านเอาง่ายกว่าครับ
Compare Java and Kotlin
จากข้างต้นที่ผมเขียนเอาไว้ว่า Kotlin มันคือ Java ที่เสร็จแล้ว ทำไมผมถึงคิดแบบนั้น เรามาดูกันครับ (ผมจะไม่พูดถึง Semicolons นะครับมันธรรมดาเกิน)
เปิดมาก็ต้อง Hello World เนอะ เอาฤกษ์เอาชัยก่อน ความไม่เวิ่นเว้อตามแบบฉบับ Java
// Java
public static void main(String[] args){
System.out.println("Hello World")
}// Kotlin
fun main(args: Array<String>) {
println("Hello World")
}
แค่ชื่อเค้าก็กินแล้วอะ fun มันบ่งบอกถึงความสนุก ฮ่า ๆ (อันนี้แอบอวย)
// Java
final String x = "Hello World";
String y = "Hello World;// Kolin
val x = "Hello World"
var y = "Hello World"// และ Kotlin มี Lazy กับ LateInit ด้วยนะครับ
// ถ้าอยากรู้มันทำอะไรยังไง แนะนำให้ไปหาอ่านต่อบอกเลยว่าของดีครับ
Feel like JavaScript ไปอีกกกกกกกกกเป็นไง คูล ๆ
// Java
if(user != null) {
user.name();
}// Kotlin
user?.name()
หมดปัญหาเรื่อง nullPointerException เพราะ Kotlin จะไม่ยอม ยกเว้นจะต้องบอกพี่เค้าก่อน อันนี้ทำให้นำไปประยุกต์ใช้ได้หลายเรื่อง และทำให้เหล่าเดฟลด Line of Code ลงไปพอสมควรเลยหละ
// Java
for (int i = 0; i < 10; i++) {
System.out.println("index: " + i)
}// Kotlin
for (i in 0..9) {
println("index: $i")
}
for
ใน Kotlin เค้าเพิ่มมาให้หลายแบบ มีแบบ i in 0 until 10
งี้ด้วยนะ
// Java
public static void main(String[] args) {
Integer a = 4;
if(a == 1) {
// sout
} else if(a == 2) {
// sout
} else if(a == 3) {
// sout
} else {
// sout
}
}// Kotlin
fun main(args: Array<String>){
val a: Int = 6
when (a) {
1 -> println("1")
2 -> {
println("2")
println("22")
}
in 3..5 -> println("3")
else -> println("Over")
}// Or
fun main(args: Array<String>){
val a: Int = 6
val result = when (a) {
1 -> "1"
2 -> {
println("2")
val i: Int = 2
}
3 -> "3"
else -> "Over"
println(result)
}
การมี When เข้ามาทำให้มันดูดีอะ แล้วยังเอาตัวแปรมารับ Function ได้อีกด้วย
// Java
List<String> data = new ArrayList<>();
data.add("X");
data.add("Y");
data.add("Z");List<String> x = Arrays.asList("X", "Y", "Z");
List<?> x = Arrays.asList("x", "y", 10);
List<Object> x = Arrays.asList("x", "y", 10);// Kolin
val array = arrayOf("X", "Y", "Z")
val mixed = arrayOf("X", 10, 9.9, true)
val numbers = intArrayOf(1, 2, 3, 4, 5)
println(mixed[0]) // X
mixed[2] = 8.8
println(mixed[2]) // 8.8
val str = "iamgique"
println(str[0]) // iprintln(0b1101 or 0b1000) // 13
println(0b1101 xor 0b1000) // 5
println(0b10011.inv() and 0x0000001F) // 0b01100 // 12
Array ใน Kotlin นี่ก็อย่างกับ JavaScript ทำได้หลากหลายมาก ยังดีที่ตั้งแต่ Java 8++ มี AsList
เข้ามา ทำให้ไม่ต้องอายเขาเท่าไหร่ในเรื่องนี้ แถมยังมี Bitwise Operators ให้ใช้อีกด้วย
นอกจากที่ได้กล่าวตัวอย่างไปข้างต้นแล้ว พวก Lambda, Stream, Map, Filter ต่าง ๆ Java เองก็มีแล้วใน Java8++ ก็เลยไม่ได้หยิบมา
Object Oriented
มาดูอะไรที่เป็น Object Oriented กันบ้าง
// Java
class Person {
private String name = "Wayne";
private Integer age = 25;
// setter // getter
}public static void main(String[] args) {
Person person = new Person();
System.out.println(person.getName);
System.out.println(person.getAge);
person.setName("Clark");
System.out.println(person.getName);
}// Kotlin
class Person {
var name: String = "Wayne"
var age: Int = 25
}fun main(args: Array<String>){
val person = Person()
println(person.name)
println(person.age)
person.name = "Clark"
println(person.name)
}
ในที่สุด Kotlin ก็ทำให้เราไม่ต้องนั่งทำ Setter, Getter เสียที อยากจะ Assign ค่าอะไรก็ยัดลงไป ไม่ต้องมา set
มา get
อีกต่อไป ภาษาอื่นเค้าทำกันได้ตั้งนานแล้ว
แล้วก็ตัด new
ทิ้งไปด้วยเวลา สร้าง Object ใหม่
// Java
class Person {
private String name;
private Integer age;
// setter // getter person(String name, Integer age) {
this.name = name;
this.age = age;
}
}public static void main(String[] args) {
Person person = new Person("Wayne", 25);
...
}// Kotlin
class Person(val name: String, val age: Int) {
var name: String
var age: Int
init {
println("Created object")
}
}fun main(args: Array<String>){
val person = Person("Wayne", 25)
...
}
Constructor ของ Kotlin มันคือ Constructor แบบที่มันควรจะเป็นมาตั้งนานแล้ว แล้วมันก็ยังสามารถ Overload ตัว Constructor ได้ด้วย แถมด้วยการ สามารถประกาศเป็น val
ได้อีกด้วยอะ
// Java
... ยาว// Kotlin
class Person(open val name: String, open val age: Int) {
var name: String
var age: Int
init {
println("Created object")
}
fun getBirthYear() = 2020 - age
}class Employee(override val name: String, override var: age: Int, val paymentId: Int): Person(name, age) {
fun getPayment() {
pringln("Payment: $paymentId")
}
}fun main(args: Array<String>){
val employee = Employee("Wayne", 25, 999)
employee.getBirthYear()
employee.getPayment()
}
ตัวอย่างการ Extends Class และ Override ใน Kotlin
// Java
public interface MoveListener<T> {
void moveForward(Model m, T data);
void moveBack(Model m, T data)
}// Kotlin
interface MoveListener<T> {
fun moveForward(m: Model, data: T)
fun moveBack(m: Model, data: T)
}
ตัวอย่าง Generic Type
Convert Java into Kotlin
การจะเปลี่ยนจาก Java ไปสู่ Kotlin นั่นก็ง่ายมากครับ ถ้าไม่อยากทำเองด้วยมือแบบ Manual เขียนใหม่ สามารถทำได้โดยการใช้ IntelliJ IDEA convert ได้เลยโดยอัตโนมัต อย่างคูลอีกแล้ว อย่างว่าแหละ ก็คนสร้าง Kotlin ก็เข้าของเดียวกันกับ Tools ที่ใช้ ฮ่า ๆ โดยสามารถดูเพิ่มเติมถึงวิธีการ Convert ได้ที่นี่
ของเดิมที่เป็น Java
// Java
public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
ให้ทำการกด ⌥⇧⌘K ใน IntelliJ IDEA จะแปลงร่างเป็นแบบด้านล่าง
// Kotlin
object Main {
@JvmStatic
fun main(args: Array<String>) {
println("Hello World")
}
}
Conclusion
เป็นยังไงกันบ้างครับ สำหรับการที่จะ Convert Java into Kotlin 101 ผมว่ามันทำให้โค้ดของเรากระชับ และอ่านง่ายขึ้นเยอะเลย ที่จริงยังมีอีกหลายอย่างเลยที่ Kotlin ทั้ง Abstract Class, Interface, Overriding, Data Classes และอื่น ๆ แต่ว่าไม่ได้นำมาเขียนเดี๋ยวมันจะยาวไป
ปัจจุบัน Google ได้แนะนำให้ใช้ Kotlin เป็นภาษาที่ใช้สำหรับเขียน Application บน Android ไปแล้ว ซึ่งก็มีโปรเจคที่ใช้ Kotlin เกิดขึ้นใหม่อยู่ทุกเมื่อเชื่อวัน พวก Framework ต่าง ๆ ที่ได้รับความนิยมใน Java ก็สามารถใช้ใน Kotlin ได้เช่นกัน เช่น Kotline Springboot
ที่จริงตัว Kotlin เองก็ไม่ใช่ว่าจะไม่มีข้อเสียซักทีเดียวนะครับ มันยังมีความที่ ไฟล์ของมันอาจจะใหญ่กว่า Java นิดหน่อย การ Convert ด้วย Tools อย่าง IntelliJ IDEA เองก็ยังไม่สามารถ Convert ได้ทั้งหมด 100%
สำหรับคนที่เขียน Java มาก่อน ผมว่าต่อยอดไม่ยากเลยครับ ส่วนคนที่ไม่เคยเขียน Java มาก่อน ก็สามารถศึกษา Kotlin ได้เลย โดยที่อาจจะไม่จำเป็นต้องเรียนรู้ Java
ทิ้งทายบทความนี้กันนิดนึงนะครับ ถึงมันคูลก็จริงแต่เราไม่ใช่นักเลง Technology ก่อนใช้ก็ต้องมั่นใจว่าเรา Operate ได้ และ สามารถทำให้ Performance ไม่ตก
และทั้งหมดนี่ก็คือหลาย ๆ อย่างรวม ๆ กัน จนผมนิยามตัวมันได้ว่า…
Kotlin มันคือ Java ที่เสร็จแล้ว…