Kotlin คืออะไร? ทางเลือก Java อธิบาย

Kotlin เป็นภาษาการเขียนโปรแกรมแบบ "ใช้งานจริง" แบบโอเพ่นซอร์สที่ใช้งานได้โดยทั่วไปซึ่งได้รับการออกแบบมาสำหรับ JVM (Java Virtual Machine) และ Android ซึ่งรวมคุณสมบัติการเขียนโปรแกรมเชิงวัตถุและฟังก์ชันการทำงานไว้ด้วยกัน เน้นไปที่การทำงานร่วมกันความปลอดภัยความชัดเจนและการสนับสนุนเครื่องมือ เวอร์ชันของ Kotlin ที่กำหนดเป้าหมาย JavaScript ES5.1 และโค้ดเนทีฟ (โดยใช้ LLVM) สำหรับโปรเซสเซอร์จำนวนหนึ่งก็อยู่ในระหว่างการผลิตเช่นกัน

Kotlin มีต้นกำเนิดที่ JetBrains ซึ่งเป็น บริษัท ที่อยู่เบื้องหลัง IntelliJ IDEA ในปี 2010 และเป็นโอเพ่นซอร์สตั้งแต่ปี 2012 ปัจจุบันทีม Kotlin มีสมาชิกเต็มเวลามากกว่า 90 คนจาก JetBrains และโครงการ Kotlin บน GitHub มีผู้ร่วมให้ข้อมูลมากกว่า 300 คน JetBrains ใช้ Kotlin ในผลิตภัณฑ์หลายประเภทรวมถึง IntelliJ IDEA ที่เป็นเรือธง

Kotlin เป็นภาษา Java ที่กระชับยิ่งขึ้น

เมื่อมองแวบแรก Kotlin ดูเหมือน Java เวอร์ชันที่กระชับและคล่องตัวกว่า พิจารณาภาพหน้าจอด้านบนซึ่งฉันได้แปลงตัวอย่างโค้ด Java (ด้านซ้าย) เป็น Kotlin โดยอัตโนมัติ สังเกตว่าการทำซ้ำแบบไม่สนใจในการสร้างอินสแตนซ์ตัวแปร Java ได้หายไปแล้ว สำนวน Java

StringBuilder sb = StringBuilder ใหม่ ();

กลายเป็น Kotlin

วาล sb = StringBuilder ()

คุณจะเห็นว่าฟังก์ชันถูกกำหนดด้วยfunคีย์เวิร์ดและตอนนี้อัฒภาคเป็นทางเลือกเมื่อมีการขึ้นบรรทัดใหม่ valคำหลักประกาศคุณสมบัติอ่านอย่างเดียวหรือตัวแปรท้องถิ่น ในทำนองเดียวกันvarคำหลักจะประกาศคุณสมบัติที่ไม่แน่นอนหรือตัวแปรท้องถิ่น

อย่างไรก็ตาม Kotlin ถูกพิมพ์อย่างรุนแรง valและvarคำหลักที่สามารถนำมาใช้เฉพาะเมื่อมีคนประเภทที่จะสามารถสรุป มิฉะนั้นคุณจะต้องประกาศประเภท การอนุมานประเภทดูเหมือนจะได้รับการปรับปรุงในแต่ละรุ่นของ Kotlin

ดูการประกาศฟังก์ชันใกล้ด้านบนของบานหน้าต่างทั้งสองบาน ประเภทการส่งคืนใน Java นำหน้าต้นแบบ แต่ใน Kotlin จะประสบความสำเร็จในต้นแบบโดยแบ่งเขตด้วยเครื่องหมายจุดคู่เช่นเดียวกับในภาษาปาสคาล

ไม่ชัดเจนจากตัวอย่างนี้ แต่ Kotlin ได้ผ่อนปรนข้อกำหนดของ Java ที่ให้ฟังก์ชันเป็นสมาชิกคลาส ใน Kotlin อาจมีการประกาศฟังก์ชันที่ระดับบนสุดในไฟล์ภายในฟังก์ชันอื่น ๆ เป็นฟังก์ชันสมาชิกภายในคลาสหรืออ็อบเจ็กต์และเป็นฟังก์ชันส่วนขยาย ฟังก์ชันส่วนขยายให้ความสามารถเหมือน C # ในการขยายคลาสด้วยฟังก์ชันใหม่โดยไม่ต้องสืบทอดจากคลาสหรือใช้รูปแบบการออกแบบประเภทใด ๆ เช่น Decorator

สำหรับแฟน ๆ Groovy Kotlin ดำเนินการสร้าง ในความเป็นจริงผู้สร้าง Kotlin สามารถตรวจสอบประเภทได้ Kotlin สนับสนุนคุณสมบัติที่ได้รับมอบหมายซึ่งสามารถใช้เพื่อใช้คุณสมบัติขี้เกียจคุณสมบัติที่สังเกตได้คุณสมบัติที่ยับยั้งได้และคุณสมบัติที่แมป

กลไกอะซิงโครนัสจำนวนมากที่มีอยู่ในภาษาอื่น ๆ สามารถนำไปใช้เป็นไลบรารีโดยใช้ Kotlin coroutines ซึ่งรวมถึงasync/ awaitจาก C # และ ECMAScript ช่องและเลือกจาก Go และgenerators/ yieldจาก C # และ Python

การเขียนโปรแกรมเชิงฟังก์ชันใน Kotlin

การอนุญาตให้ใช้ฟังก์ชันระดับบนสุดเป็นเพียงจุดเริ่มต้นของเรื่องราวการเขียนโปรแกรมเชิงฟังก์ชันสำหรับ Kotlin ภาษานี้ยังรองรับฟังก์ชันลำดับที่สูงขึ้น, ฟังก์ชันที่ไม่ระบุตัวตน, lambdas, ฟังก์ชันแบบอินไลน์, การปิด, การเรียกซ้ำหางและทั่วไป กล่าวอีกนัยหนึ่ง Kotlin มีคุณสมบัติและข้อดีทั้งหมดของภาษาที่ใช้งานได้ ตัวอย่างเช่นพิจารณาสำนวน Kotlin ที่ใช้งานได้ดังต่อไปนี้

การกรองรายการใน Kotlin

val positives = list.filter {x -> x> 0}

สำหรับนิพจน์ที่สั้นกว่าให้ใช้itเมื่อมีเพียงพารามิเตอร์เดียวในฟังก์ชันแลมบ์ดา:

val positives = list.filter {it> 0}

สำรวจแผนที่ / รายชื่อคู่ใน Kotlin

สำหรับ ((k, v) ในแผนที่) {println (“ $ k -> $ v”)}

kและ  v สามารถเรียกว่าอะไรก็ได้

ใช้ช่วงใน Kotlin

สำหรับ (i in  1..100) {... } // ช่วงปิด: รวม 100

สำหรับ (i in  1 ถึง 100) {... } // half-open range: ไม่รวม 100

สำหรับ (x ใน 2..10 ขั้นตอนที่ 2) {... }

สำหรับ (x in  10 downTo 1) {... }

ถ้า (x ใน 1..10) {... }

ตัวอย่างข้างต้นแสดง  for คำหลักและการใช้ช่วง

แม้ว่า Kotlin จะเป็นภาษาการเขียนโปรแกรมที่ใช้งานได้เต็มรูปแบบ แต่ก็ยังคงรักษาลักษณะเชิงวัตถุส่วนใหญ่ของ Java ไว้เป็นรูปแบบการเขียนโปรแกรมทางเลือกซึ่งมีประโยชน์มากเมื่อแปลงรหัส Java ที่มีอยู่ Kotlin มีชั้นเรียนที่มีการก่อสร้างพร้อมกับซ้อนกันภายในและไม่ระบุชื่อชั้นเรียนภายในและมีการเชื่อมต่อเช่น Java 8. Kotlin ไม่ได้มีnewคำหลัก ในการสร้างอินสแตนซ์คลาสให้เรียกตัวสร้างเหมือนกับฟังก์ชันทั่วไป เราเห็นสิ่งนั้นในภาพหน้าจอด้านบน

Kotlin มีมรดกเดียวจาก superclass ชื่อและทุกชั้นเรียน Kotlin มี superclass เริ่มต้นAnyซึ่งเป็นไม่ได้java.lang.Objectเช่นเดียวกับชั้นฐาน Java Anyมีเพียงสามฟังก์ชั่นที่กำหนดไว้ล่วงหน้าสมาชิก: equals(), และhashCode()toString()

คลาส Kotlin จะต้องถูกทำเครื่องหมายด้วยopenคีย์เวิร์ดเพื่อให้คลาสอื่น ๆ สามารถสืบทอดจากคลาสเหล่านั้นได้ คลาส Java เป็นคลาสตรงกันข้ามเนื่องจากสามารถสืบทอดได้เว้นแต่จะทำเครื่องหมายด้วยfinalคีย์เวิร์ด เพื่อแทนที่วิธี superclass เป็นวิธีการที่ตัวเองจะต้องมีการทำเครื่องหมายopenและวิธีการ subclass overrideจะต้องมีการทำเครื่องหมาย ทั้งหมดนี้เป็นส่วนหนึ่งของปรัชญาของ Kotlin ในการทำให้สิ่งต่างๆชัดเจนมากกว่าการใช้ค่าเริ่มต้น ในกรณีนี้ฉันสามารถเห็นได้ว่าวิธีการของ Kotlin ในการทำเครื่องหมายสมาชิกคลาสฐานอย่างชัดเจนว่าเปิดสำหรับการสืบทอดและสมาชิกคลาสที่ได้รับมาจากการแทนที่เพื่อหลีกเลี่ยงข้อผิดพลาด Java ทั่วไปหลายประเภท

คุณลักษณะด้านความปลอดภัยใน Kotlin

เมื่อพูดถึงการหลีกเลี่ยงข้อผิดพลาดทั่วไป Kotlin ได้รับการออกแบบมาเพื่อขจัดอันตรายจากการอ้างอิงตัวชี้ว่างและปรับปรุงการจัดการค่า null ซึ่งทำได้โดยการสร้างnullประเภทมาตรฐานที่ผิดกฎหมายเพิ่มประเภทที่เป็นโมฆะและใช้สัญลักษณ์ทางลัดเพื่อจัดการกับการทดสอบค่าว่าง

ตัวอย่างเช่นตัวแปรประเภทปกติ  ไม่สามารถเก็บ  :String null

var a: String = "abc"

a = null // ข้อผิดพลาดในการคอมไพล์

หากคุณต้องการที่จะอนุญาตให้ nulls ตัวอย่างเช่นเพื่อผลแบบสอบถามถือ SQL คุณสามารถประกาศประเภท nullable String?โดยท้ายเครื่องหมายคำถามประเภทเช่น

var  b: สตริง?

b = null  // ตกลง

การป้องกันไปอีกเล็กน้อย คุณสามารถใช้ชนิดที่ไม่เป็นโมฆะได้โดยไม่ต้องรับโทษ แต่คุณต้องทดสอบประเภทที่เป็นโมฆะสำหรับค่า null ก่อนจึงจะใช้งานได้

เพื่อหลีกเลี่ยงไวยากรณ์ละเอียดที่จำเป็นสำหรับการทดสอบตามปกติโมฆะ Kotlin แนะนำโทรปลอดภัย?.เขียน ตัวอย่างเช่นส่งกลับถ้าไม่ใช่และอย่างอื่น ประเภทของการแสดงออกนี้อยู่b?.length b.lengthbnullnullInt?

ในคำอื่น ๆเป็นทางลัดสำหรับb?.length if (b != null) b.length else nullไวยากรณ์นี้เชื่อมโยงกันอย่างดีโดยกำจัดตรรกะ prolix จำนวนมากโดยเฉพาะอย่างยิ่งเมื่อมีการเติมวัตถุจากชุดแบบสอบถามฐานข้อมูลซึ่งอาจล้มเหลว ตัวอย่างเช่นbob?.department?.head?.nameจะส่งคืนชื่อของหัวหน้าแผนกของ Bob หาก Bob แผนกและหัวหน้าแผนกทั้งหมดไม่เป็นค่าว่าง

ในการดำเนินการบางอย่างสำหรับค่าที่ไม่ใช่ค่าว่างคุณสามารถใช้ตัวดำเนินการโทรปลอดภัย?.ร่วมกับ  let:

val listWithNulls: List = listOf ("A", null)

สำหรับ (รายการใน listWithNulls) {

      item? .let {println (it)} // พิมพ์ A และละเว้น null}

บ่อยครั้งที่คุณต้องการส่งคืนค่าที่ถูกต้อง แต่พิเศษจากนิพจน์ที่เป็นโมฆะโดยปกติแล้วคุณสามารถบันทึกลงในประเภทที่ไม่เป็นค่าว่างได้ มีไวยากรณ์พิเศษสำหรับการนี้เรียกว่าผู้ประกอบการเอลวิส (เด็กผมคุณไม่ได้) ?:เขียนเป็น

Val l = b? .length?: -1

เทียบเท่ากับ 

val l: Int = if (b! = null) b.length else -1

ในหลอดเลือดดำเดียวกัน Kotlin จะละเว้นข้อยกเว้นที่ตรวจสอบของ Java ซึ่งเป็นเงื่อนไขที่สามารถโยนได้ที่ต้องถูกจับ ตัวอย่างเช่นลายเซ็น JDK

ต่อท้ายผนวก (CharSequence csq) พ่น IOException;

ต้องการให้คุณจับIOExceptionทุกครั้งที่คุณเรียกใช้appendวิธีการ:

ลอง {

  log.append (ข้อความ)

}

จับ (IOException จ) {

  // ทำบางอย่างโดยมีข้อยกเว้น

}

นักออกแบบของ Java คิดว่านี่เป็นความคิดที่ดีและเป็นชัยชนะสำหรับโปรแกรมของเล่นตราบใดที่โปรแกรมเมอร์ใช้สิ่งที่สมเหตุสมผลในcatchประโยค ทั้งหมดบ่อยเกินไปในโปรแกรม Java ขนาดใหญ่ แต่คุณเห็นรหัสที่บังคับใช้catchข้อมีอะไร //todo: handle thisแต่ความคิดเห็น: สิ่งนี้ไม่ได้ช่วยใครเลยและการตรวจสอบข้อยกเว้นกลายเป็นการสูญเสียสุทธิสำหรับโปรแกรมขนาดใหญ่

โคตลินโครูทีน

Coroutines ใน Kotlin เป็นด้ายที่มีน้ำหนักเบาเป็นหลัก คุณเริ่มต้นให้กับlaunchผู้สร้าง coroutine CoroutineScopeในบริบทของบางคน ขอบเขตโครูทีนที่มีประโยชน์ที่สุดอย่างหนึ่งคือrunBlocking{}ซึ่งใช้กับขอบเขตของบล็อกโค้ด

นำเข้า kotlinx.coroutines. *

หลักสนุก () = runBlocking {// this: CoroutineScope

    เปิดตัว {// เปิดโครูทีนใหม่ในขอบเขตของ runBlocking

        ล่าช้า (1000L) // หน่วงเวลาไม่ปิดกั้นเป็นเวลา 1 วินาที

        println ("โลก!")

    }

    println ("สวัสดี")

}

รหัสนี้สร้างเอาต์พุตต่อไปนี้โดยมีการหน่วงเวลาหนึ่งวินาทีระหว่างบรรทัด:

สวัสดี,

โลก!

Kotlin สำหรับ Android

จนถึงเดือนพฤษภาคม 2017 ภาษาโปรแกรมเดียวที่รองรับอย่างเป็นทางการสำหรับ Android คือ Java และ C ++ Google ประกาศการสนับสนุนอย่างเป็นทางการสำหรับ Kotlin บน Android ในงาน Google I / O 2017 และเริ่มต้นด้วย Android Studio 3.0 Kotlin ถูกสร้างขึ้นในชุดเครื่องมือการพัฒนา Android คุณสามารถเพิ่ม Kotlin ลงใน Android Studio เวอร์ชันก่อนหน้าได้ด้วยปลั๊กอิน

Kotlin คอมไพล์โค้ดไบต์เดียวกับ Java ทำงานร่วมกับคลาส Java ในรูปแบบธรรมชาติและแชร์เครื่องมือกับ Java เนื่องจากไม่มีค่าใช้จ่ายในการโทรกลับไปกลับมาระหว่าง Kotlin และ Java การเพิ่ม Kotlin เพิ่มขึ้นทีละน้อยในแอป Android ใน Java จึงเหมาะสม ไม่กี่กรณีที่ความสามารถในการทำงานร่วมกันระหว่างโคตลินและโค้ด Java ขาดความสง่างามเช่นคุณสมบัติเฉพาะของ Java มักไม่ค่อยพบและแก้ไขได้ง่าย

Pinterest เป็นโปสเตอร์ย่อยสำหรับแอพ Android ที่เขียนใน Kotlin เมื่อต้นเดือนพฤศจิกายน 2016 และได้รับการกล่าวถึงอย่างเด่นชัดใน Google I / O 2017 ซึ่งเป็นส่วนหนึ่งของการประกาศของ Kotlin นอกจากนี้ทีม Kotlin ยังชอบอ้างถึงแอป Evernote, Trello, Square และ Coursera สำหรับ Android

Kotlin กับ Java

คำถามที่ว่าจะเลือก Kotlin หรือ Java สำหรับการพัฒนาใหม่เกิดขึ้นมากมายในชุมชน Android นับตั้งแต่การประกาศ Google I / O แม้ว่าจะมีคนถามคำถามนี้ในเดือนกุมภาพันธ์ 2016 เมื่อ Kotlin 1.0 จัดส่ง คำตอบสั้น ๆ คือโค้ด Kotlin ปลอดภัยและรัดกุมกว่าโค้ด Java และไฟล์ Kotlin และ Java สามารถอยู่ร่วมกันในแอพ Android ได้ดังนั้น Kotlin จึงไม่เพียงมีประโยชน์สำหรับแอพใหม่ ๆ เท่านั้น แต่ยังช่วยขยายแอพ Java ที่มีอยู่ด้วย

ข้อโต้แย้งที่เป็นฟันเฟืองเดียวที่ฉันได้เห็นในการเลือก Java บน Kotlin คือสำหรับผู้เริ่มต้นพัฒนา Android ที่สมบูรณ์ สำหรับพวกเขาอาจมีอุปสรรคในการเอาชนะเนื่องจากในอดีตเอกสารและตัวอย่าง Android ส่วนใหญ่อยู่ใน Java ในทางกลับกันการแปลง Java เป็น Kotlin ใน Android Studio เป็นเรื่องง่าย ๆ ในการวางโค้ด Java ลงในไฟล์ Kotlin

สำหรับเกือบทุกคนที่พัฒนา Android ข้อดีของ Kotlin คือสิ่งที่น่าสนใจ เวลาทั่วไปที่เสนอสำหรับนักพัฒนา Java เพื่อเรียนรู้ Kotlin คือไม่กี่ชั่วโมงซึ่งเป็นราคาเพียงเล็กน้อยที่ต้องจ่ายเพื่อกำจัดข้อผิดพลาดในการอ้างอิงที่เป็นโมฆะเปิดใช้งานฟังก์ชันส่วนขยายสนับสนุนการเขียนโปรแกรมเชิงฟังก์ชันและเพิ่มโครูทีน ค่าประมาณคร่าวๆโดยทั่วไประบุว่ามีการตัดจำนวนบรรทัดของโค้ดจาก Java ถึง Kotlin ประมาณ 40 เปอร์เซ็นต์